初始化的不可变的最终字段是否应该是静态的?

use*_*169 4 java

我想知道是否会有非空/初始化不可变最终字段的合法用例.

换一种说法:

class Foo {
  private final String bar = "bar";
}
Run Code Online (Sandbox Code Playgroud)

class Foo {
  private static final String BAR = "bar";
}
Run Code Online (Sandbox Code Playgroud)

Psh*_*emo 8

在大多数情况下,答案是:它取决于.

制作它意味着什么static?实际上,它意味着让所有实例使用该字段的相同值.

大多数情况下,不可变对象可以在所有实例之间共享而没有问题.就像在这种情况下一样,将它设置为静态是有意义的,因为您希望类的所有实例都使用该字段的相同.

但是不要忘记,即使对象是不可变的,它仍然具有可变属性,就像monitor在同步机制中使用它一样.让我们说你的班级有

private final Object lock = new Object(); 
Run Code Online (Sandbox Code Playgroud)

并且每个实例都应该使用自己的lock对象进行同步(例如synchronize(lock){...}).尽管事实Object是不可变的,但lock静态不是我们想要的(lock不应该共享值,而是为每个实例分开).