Java 私有final字段也应该是静态的吗?
我想知道,如果我的类中有这个字段:Java 私有final字段也应该是静态的吗?,java,static,Java,Static,我想知道,如果我的类中有这个字段:private-final-int-foo=…,我应该把它放在staticprivate-static-final-int-foo=…中吗?因为如果它是静态的,它对我的类的所有实例都是公共的,并且永远不会改变 有没有理由不把它放在静态中?或者我必须将它放在静态中吗?如果类的每个实例都应该具有相同的foo不可变值,那么应该将foo设置为final和static。如果类的每个实例都可以有不同的(但仍然是不可变的)foo值,那么该值应该是final 但是,如果类的每个
private-final-int-foo=…
,我应该把它放在staticprivate-static-final-int-foo=…
中吗?因为如果它是静态的,它对我的类的所有实例都是公共的,并且永远不会改变
有没有理由不把它放在静态中?或者我必须将它放在静态中吗?如果类的每个实例都应该具有相同的foo不可变值,那么应该将foo设置为final和static。如果类的每个实例都可以有不同的(但仍然是不可变的)foo值,那么该值应该是final 但是,如果类的每个实例都应该具有相同的foo不可变值,那么它实际上是一个常量。按照惯例,其通常编码如下:
private static final int FOO = ...
注意大写表示常量…如果类的每个实例都应该具有相同的foo不可变值,那么应该将foo设置为final和static。如果类的每个实例都可以有不同的(但仍然是不可变的)foo值,那么该值应该是final 但是,如果类的每个实例都应该具有相同的foo不可变值,那么它实际上是一个常量。按照惯例,其通常编码如下:
private static final int FOO = ...
注意表示常量的大写…如果在
构造函数中初始化它的值,那么它不应该是静态的
private final int foo;
public MyClass(int m){
foo=m;
}
因为它的值取决于入口值
但是如果你像这样初始化它的值
private final int foo = 100;
然后最好是static
,只有一个实例,因为final
字段将在类的每个实例上创建;但是静态
将被创建一次。如果您在构造函数中初始化它的值
,那么它不应该是静态的
private final int foo;
public MyClass(int m){
foo=m;
}
因为它的值取决于入口值
但是如果你像这样初始化它的值
private final int foo = 100;
然后最好是static
,只有一个实例,因为final
字段将在类的每个实例上创建;但是静态的
将被创建一次。这两个非访问修饰符之间有很大的区别
final
表示变量可以赋值一次李>
static
将其范围设置为与类相关(而不是实例或本地上下文)李>
除非是有意的,否则他们没有理由走到一起
静态final
变量实际上是一个常量
例如,在接口
中声明的字段隐式地为公共
、静态
和最终
在final
的使用示例中,您可以找到非静态
字段:
- 在匿名类外部声明并在其内部引用的字段
- 在本地类(在同一方法的主体中声明)内引用的本地字段(在方法的主体中声明)
- 等等
两个非访问修饰符之间存在很大差异
final
表示变量可以赋值一次李>
static
将其范围设置为与类相关(而不是实例或本地上下文)李>
除非是有意的,否则他们没有理由走到一起
静态final
变量实际上是一个常量
例如,在接口
中声明的字段隐式地为公共
、静态
和最终
在final
的使用示例中,您可以找到非静态
字段:
- 在匿名类外部声明并在其内部引用的字段
- 在本地类(在同一方法的主体中声明)内引用的本地字段(在方法的主体中声明)
- 等等
它是一个常量,您不希望类的每个实例都有一个变量的副本,所以将其设为静态。另外,如果要从静态方法使用它们,请将其设置为静态
静态变量是一个类的所有实例的公共变量。如果一个实例更改了它,那么所有其他实例的静态变量值都将更新
如果不希望此行为,请将其保持为非静态。它是一个常量,并且您不希望为类的每个实例都有一个变量副本,因此请将其设置为静态。另外,如果要从静态方法使用它们,请将其设置为静态
静态变量是一个类的所有实例的公共变量。如果一个实例更改了它,那么所有其他实例的静态变量值都将更新
如果不希望此行为,请将其保持为非静态。构造函数仍然可以设置最终成员:因此,如果类的每个实例都可以在构造函数中设置foo,并且此值应仅属于该实例,则它应仅为final,而不是静态
然而,如果只在声明时设置foo,这可能意味着这是所有实例的一个公共值,并且通过声明它也是静态的,您将赢得一点内存。但是要注意,如果foo不是原语而是引用成员,final只意味着引用不能更改,而不是对象的内容,因此作为引用的final和非静态成员不应该自动是静态的。您可能希望类的每个实例都有一个不可变的引用,对象状态不同。最终成员仍然可以由构造函数设置:因此,如果类的每个实例都可以在构造函数中设置foo,并且该值应该只属于该实例,那么它应该是最终的,而不是静态的
但是,如果只在声明时设置foo,则可能意味着这是一个常见的v