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

时间:2018-03-03 09:23:53

标签: java

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

换句话说:

class Foo {
  private final String bar = "bar";
}

对战

class Foo {
  private static final String BAR = "bar";
}

1 个答案:

答案 0 :(得分:8)

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

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

大多数情况下,不可变对象可以在所有实例之间共享而不会出现问题。就像在这种情况下一样,使其成为静态因为您希望类的所有实例都使用该字段的相同

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

private final Object lock = new Object(); 

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