我想知道,如果我在课堂上有这个字段:private final int foo = ...
,我应该把它放在静态private static final int foo = ...
吗?因为如果它是静态的,它对我班级的所有实例都是通用的,并且永远不会改变。
有没有理由不把它放在静态?或者我必须把它放在静态?
答案 0 :(得分:5)
如果你的类的每个实例都应该具有foo的相同的不可变值,那么你应该使foo为final和static。如果你的类的每个实例都可以为foo提供不同的(但仍然是不可变的)值,那么该值应该是最终的。
但是,如果你的类的每个实例都应该具有相同的foo不可变值,那么它实际上是一个常量。按照惯例,通常编码如下:
private static final int FOO = ...
请注意大写字母表示常量......
答案 1 :(得分:3)
如果您在constructor
中启动其值,那么它不应该是static
private final int foo;
public MyClass(int m){
foo=m;
}
因为它的值取决于入门价值。
但是如果你像
那样内联它的价值private final int foo = 100;
然后它首选只有static
只有一个实例,因为final
字段将在每个类实例上创建;但static
将被创建一次。
答案 2 :(得分:1)
两个非访问修饰符之间存在很大差异。
final
表示您的变量可以分配一次值。 static
将其范围设置为与类相关(而不是实例或本地上下文)。 除非按照设计,否则没有理由将它们放在一起。
static final
变量事实上 常量。
例如,interface
中声明的字段隐含public
,static
和final
。
在final
的使用示例中,您可以找到非static
字段:
答案 3 :(得分:1)
这是一个常量,您不希望为该类的每个实例都有一个变量副本,因此请将其设置为静态。此外,如果要从静态方法中使用它们,请将其设置为静态。
静态变量是一个类的所有实例共有的变量。如果一个实例更改了它,那么将为所有其他实例更新静态变量的值。
如果您不想要此行为,请将其保持为非静态。
答案 4 :(得分:1)
构造函数仍然可以设置最终成员:因此,如果您的类的每个实例都可以在构造函数中设置foo,并且此值应仅适用于该实例,则它应该只是final,而不是static。
但是,如果foo仅在声明时设置,则可能意味着这是所有实例的公共值,并且通过将其声明为静态来赢得一点内存。请注意,如果foo不是基元而是引用成员,则final仅表示引用不能更改,而不是对象的内容,因此作为引用的最终和非静态成员不应自动为静态。对于每个类的实例,您可能需要一个不可变引用,具有不同的对象状态。