Java 全局变量的使用
为什么我在阅读其他代码时经常看到“全局变量”的广泛使用 例如,在Java代码中:Java 全局变量的使用,java,variables,Java,Variables,为什么我在阅读其他代码时经常看到“全局变量”的广泛使用 例如,在Java代码中: public class SomeClass { Button btn1; private void someMethod() { btn = new Button(); } } btn1被声明为“全局”和“方便”变量,以便在整个类中轻松访问。但当它没有修饰符时,它默认为Java中的默认访问 这可能是安全风险吗?如果人们只打算在一个特定的类中使用私有修饰符,为什么不立即用私有修饰符
public class SomeClass {
Button btn1;
private void someMethod() {
btn = new Button();
}
}
btn1
被声明为“全局”和“方便”变量,以便在整个类中轻松访问。但当它没有修饰符时,它默认为Java中的默认访问
这可能是安全风险吗?如果人们只打算在一个特定的类中使用私有修饰符,为什么不立即用私有修饰符声明它们呢?它不是全局变量(Java中是否存在这种情况?我想这取决于对全局变量的定义)。它仍然是一名班级成员
,因此该变量不是公共的,但可以由同一包中的其他类访问
通常情况下,人们应该努力实现“最佳”数据封装,但在某些情况下,这可能是合适的。私有/公共与安全无关,而是限制代码的范围/使用 尽管如此,最好按它们应该的样子称呼它们:因此,如果它们应该是私有的,就将它们设为私有。java中没有“全局”这样的东西。只有public、private、protected和default。对于类变量,默认值通常是不受欢迎的,因为它破坏了封装 如果人们只打算在一个特定的类中使用它们,为什么不立即用private修饰符声明它们呢 *因为他们无知/不在乎/顽皮/想惹你生气+ *酌情删除 +阴谋论理论家
这不是一个全局变量。它具有默认访问权限,因此它不是全局可见的,并且是实例成员,这意味着它的作用域是
SomeClass
的实例。与Java中的全局变量最接近的等价物是公共类中的公共静态字段。即使在这种情况下,对于您正在使用的容器类,它也只是相对于类加载器的全局变量——在同一JVM中运行并加载同一容器类的不同类加载器将有一个单独的静态变量
说了所有这些,我个人不赞成字段不是私有的,以帮助封装。(当然,这并不能单独提供封装,但这只是一个开始。)字段是类实现的一部分,应该可以修改,而不会影响仅依赖类API的任何人。如果您的问题是
为什么人们不马上用私有修饰语声明它们呢
我的答案是:因为他们懒惰。我不知道这些“人”是谁,我总是将我的领域声明为私有,除非我有很好的理由不这样做。我想很难回答为什么有些人这样做,我们不知道他们的级别;)一般来说,您是对的,它可能会导致错误请使用一个标题,这是一个问题(可以回答),例如,“出于什么原因,我应该使用默认访问修饰符而不是private?”在Java中,最接近全局变量的可能是不是
final
的public static
变量public static
是全局的,即使引用是不可变的。@Steve:如果它是final
,那么我不会称它为“变量”,而是一个常量(是的,类型可能是可变的…)。在Java中,final变量仍然被称为变量。SteveKuo当然,但是@JoachimSauer说的是Java中的“最接近全局变量的东西”。因为Java没有“全局变量”,所以没有理由假设Java所称的“变量”(例如,最终变量)必须符合其他人所称的“全局变量”的条件“我完全不同意第4条。我认为最好是尽可能限制变量:通常将它们设置为私有,如果可以将它们设置为final
,那么就这样做。@Jon Skeet-我的错,我想在这里多说些……英语不是第一语言;-)“如果某个类只是一个数据持有者”,并且btn1
是不可变的,那么它应该声明为final
。正如现在的代码一样,同一个包中的类可以修改SomeClass
的btn1
。