在Java中不可变


问题内容

在有效Java中,Bloch建议使所有字段最终成为使对象不变的对象。

是否有必要这样做?不只是不提供访问器方法就使其不可变。

例如

class A {
      private int x;
      A (int x) {
          this.x = x;
      }
}

上述类是不可变的,即使我不申报xfinal吗?我想念什么吗?


问题答案:

除了@Bozho的要点之外,将字段声明为final意味着可以安全地访问它而无需任何同步。

相反,如果该字段不是final,则存在另一个风险,即如果另一个线程在没有适当同步的情况下访问该字段,则另一个线程将看到该字段的异常值。即使在对象构建后没有任何改变字段值的情况,也会发生这种情况!