确定性的 final

java中,用final来表示不变量。final修饰的变量即为常量,不可改变。

当我们需要一个常量对象时,例如:

final Object obj = new Object();

final的限制范围是,对象obj。所以,对象obj不可变化。

实质上,obj只是new Object()的引用,也就是说obj指向这个对象。因为obj是不可变的,所以obj会一直指向这个对象,直到

海枯石烂,山无棱,天地合!但是,final并没有限制new Object()这个对象,也就是说,这个对象还是可以随意变化的,只要你愿意!

 事实上,是可以定义和实现immutable class(不可变类)的,immutable 的对象从建构以后一定不会被改变了。因此它具备天生的“多线程安全性”。

注意:immutable不同于final,它并不是一个可以修饰不可变对象的关键字!所以不可变的对象只能通过一定规范的编码实现。具体有这么几项要求:

  1. 声明class必须是final的;
  2. class 中的所有数据声明必须为private的;
  3. class中只提供取值函数(getter),不允许存在设值函数(setter);
  4. 在构造函数中设定class内含有的所有数据的值;
  5. 当涉及到可变对象的引用的时候,需要实施clone()。

通过以上可以看出,虽然immutable对象在同步机制中会获得好的性能,但它为支持不可变性所不得不实现的额外代码也是需要付出比较大的代价的!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值