我想知道是否存在非空/初始化不可变最终字段的合法用例。
换句话说:
class Foo {
private final String bar = "bar";
}
对战
class Foo {
private static final String BAR = "bar";
}
答案 0 :(得分:8)
在大多数情况下,答案是:取决于。
制作static
是什么意思?实际上,它意味着让所有实例都使用该字段的相同值。
大多数情况下,不可变对象可以在所有实例之间共享而不会出现问题。就像在这种情况下一样,使其成为静态因为您希望类的所有实例都使用该字段的相同值。
但是不要忘记,即使对象是不可变的,它仍然具有像monitor
这样的可变属性,用于同步机制。让我们说你的班级有
private final Object lock = new Object();
并且每个实例都应该使用自己的lock
对象进行同步(如synchronize(lock){...}
)。尽管Object
是不可变的,但lock
静态不是我们想要的(不应该共享lock
的值,而是为每个实例分别分开)