java对象的我可变属性,java – 不可变对象的所有属性必须是final的吗?

不可变对象(所有属性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???");

这个程序可以在理论上打印什么???。如果我是最后的,这不会是一个法律结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值