在Java中不可变
问题内容:
在有效Java中,Bloch建议使所有字段最终成为使对象不变的对象。
是否有必要这样做?不只是不提供访问器方法就使其不可变。
例如
class A {
private int x;
A (int x) {
this.x = x;
}
}
上述类是不可变的,即使我不申报x
的final
吗?我想念什么吗?
问题答案:
除了@Bozho的要点之外,将字段声明为final
意味着可以安全地访问它而无需任何同步。
相反,如果该字段不是final
,则存在另一个风险,即如果另一个线程在没有适当同步的情况下访问该字段,则另一个线程将看到该字段的异常值。即使在对象构建后没有任何改变字段值的情况,也会发生这种情况!