这是Java Concurrency in Practice中的一句话
共享的只读对象包括不可变的和实际上不可变的对象。
不变对象和有效不变对象之间有什么区别?
不可扩展且其字段全部为final自身且不可变的类的实例是不可变的。
final
由于其方法的详细信息而无法更改其字段的类的实例实际上是不可变的。例如:
final class C { final boolean canChange; private int x; C(boolean canChange) { this.canChange = canChange; } public void setX(int newX) { if (canChange) { this.x = newX; } else { throw new IllegalStateException(); } } }
的某些实例C实际上是不可变的,而有些则不是。
C
另一个例子是零长度数组。它们实际上是不可变的,即使它们的包含类不是可证明的不可变的,因为它们中没有元素可以更改。
Joe- E使用验证程序来证明某些类仅允许不可变的实例。Immutable检查用标记器接口标记的所有内容,并将某些类String((由于它char[]不会逃逸,因此实际上是不可更改的))视为不可变的。
Immutable
String
char[]
Joe-E:面向安全性的Java子集说
由Joe-E库定义的Immutable接口受到以下语言的特殊处理:Joe- E验证程序检查实现此接口的每个对象都是(深度)不可变的,如果不能自动将其引发编译时错误。已验证。