为什么Java中没有全局变量?

11

为什么Java中没有全局变量?


6
对于“完全”的某些定义可能会有不同的解释。 :) - Adam Paynter
1
你可以使用GodObject模式来规避这个问题 :) - kostja
2
太局限了?你们这些关闭者知道他在谈论编程语言,而不是岛屿,对吧? - Mark Peters
3
彼得·诺维格的《Java IAQ - 为什么Java没有全局变量?》副本。 - Dori
6个回答

25

全局变量通常是设计缺陷。

您的组件应该是自包含的,不应需要任何全局状态。
取而代之的是,请使用私有静态字段。


3
有些情况下你需要一个静态变量,Java使用static提供了这种功能。 - Teja Kantamneni

11
你的问题的答案是:由于Java的设计原则不支持全局变量。Java是以面向对象的原则为基础设计的,因此在Java中每个变量都是局部变量或类的成员。
静态类成员是全局可访问的,在某种程度上,这确实是全局变量的一种可能定义方式,取决于你对该术语的解释。但严格来说,尽管静态类成员可以通过类名访问,并跨多个作用域使用,它们仍然是类的成员。因此并非真正意义上的全局变量。
Java不支持全局变量是一件好事,因为使用全局变量是一个设计反模式。

Java实际上确实有全局变量。否则,System.out怎么可能不是全局变量呢?如果我们采用维基百科的定义,那么很明显Java确实有全局变量,因此这个问题无法回答,因为它基于错误的假设。 - Ingo
1
我选择将问题理解为“为什么Java没有全局变量”(即真正全局范围的变量,而不是像System.out这样在类范围内但因为它们是静态的所以可以全局访问的变量),因为只有这种情况下问题才有意义。我明白你的意思,因为我引用了维基百科,与该立场相矛盾。我会编辑一下。 - razlebe
4
维基百科将“global”定义为“在每个范围内都可访问”。 out 仅在 System 上下文中可访问,因此它不是全局变量,并且 System 本身也不是一个变量。因此, System.out 不是全局变量。维基百科还表示,Java没有显式的全局变量。如果你读到了其他任何内容,那就是不正确的。 - user207421
1
@EJP 这纯粹是形式主义。要么就是混淆了简单名称的作用域规则和数据的可访问性。通过编写该名称,可以精确地访问名为“System.out”的数据。哪里说全局数据必须有一个简单的名称? - Ingo
2
@EJP,您引用的维基页面的第二段列出了我们关心全局变量的原因。请注意,这一切都适用于公共静态类成员。维基文章在某种程度上存在缺陷,因为它侧重于全局变量(即名称),这只是呈现全局状态的通常方式,但不是唯一的方式。 - Ingo
@Ingo System.out 指的是 java.lang.System 类上的类型为 PrintStream 的静态字段 out。当这个答案特别提到 静态类成员 时,它确切地指的就是这个。 - M. Justin

2

实际上,系统属性与全局变量有一定的相似之处 - 您可以在一个类中设置它们,在另一个类中读取它们。这在相当复杂的企业环境中非常常见。例如,JBoss通常提供一种定义和访问系统属性的机制。


1

我们可以使用静态类来保存全局/应用程序变量 例如

//Global Class
public class GlobalClass {
            public static String globalVariable = "globalValue";
    }



//Main Method
public static void main(String args[]){

      System.out.println("globalVariable:"+GlobalClass.globalVariable);
      GlobalClass.globalVariable = "newglobalValue";
      System.out.println("globalVariable:"+GlobalClass.globalVariable);

   }

1
如果你正在开发一个Web应用程序,那么你可以使用会话变量作为全局变量...这将在Web应用程序中的所有页面中都可用...

1

理性的原因是全局变量通常不是一个好主意,所以在语言中不包含它们没有任何缺点。

然后有一个实际的语法原因:根据语法,Java 中的所有内容都需要在类的范围内定义。因此,你不能真正地将命名变量放在“全局”位置,而不改变 Java 的作用域规则。可以说,在语法中 Java 允许的最接近“全局”的东西是类的“public static”成员,它可以在许多方面像全局变量一样使用。

最后,还有一个经常被忽视的简单原则,它有许多形式:“如果不确定就不要加入”。或者“保持简单,傻瓜”。或者YAGNI。在语言设计中,功能越少通常越好。总的来说,从这个角度来看,Java 设计得非常好,经受住了时间的考验。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接