在java中不可变

use*_*434 3 java immutability effective-java

Effective Java中,Bloch建议在使对象不可变时使所有字段成为最终字段.

有必要这样做吗?不会只给出访问器方法使它不可变.

例如

class A {
      private int x;
      A (int x) {
          this.x = x;
      }
}
Run Code Online (Sandbox Code Playgroud)

上述类是不可变的,即使我不申报xfinal吗?我错过了什么吗?

Ste*_*n C 6

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

相反,如果字段不final存在,则如果没有正确同步,则另一个线程在访问它时会看到该字段的异常值存在很小的风险.即使在对象构造之后没有任何改变字段的值,也会发生这种情况!


Boz*_*zho 5

它不是"完全"不可变的,因为您可以更改值.接下来的事情将是团队中的其他人为该领域分配新值.final表明不变性的意图.