不可变对象(所有属性final)和有效不可变对象(属性不是final,但不能更改)之间的主要区别是安全发布。
final fields also allow programmers to implement thread-safe immutable objects without synchronization. A thread-safe immutable object is seen as immutable by all threads, even if a data race is used to pass references to the immutable object between threads. This can provide safety guarantees against misuse of an immutable class by incorrect or malicious code. final fields must be used correctly to provide a guarantee of immutability.
作为一个附注,它还使强制不可变性(如果你尝试在类的未来版本中改变这些字段,因为你已经忘记它应该是不可变的,它不会编译)。
澄清
>使一个对象的所有字段最终不会使它不可变 – 你还需要确保(i)它的状态不能改变(例如,如果对象包含最终的List,没有变化操作(添加,删除…)必须在施工后进行)和(ii)在施工期间不要让这种逃逸
>一个有效的不可变对象一旦安全发布就是线程安全的
>不安全发布的示例:
class EffectivelyImmutable {
static EffectivelyImmutable unsafe;
private int i;
public EffectivelyImmutable (int i) { this.i = i; }
public int get() { return i; }
}
// in some thread
EffectivelyImmutable.unsafe = new EffectivelyImmutable(1);
//in some other thread
if (EffectivelyImmutable.unsafe != null
&& EffectivelyImmutable.unsafe.get() != 1)
System.out.println("What???");
这个程序可以在理论上打印什么???。如果我是最后的,这不会是一个法律结果。