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,它并不是一个可以修饰不可变对象的关键字!所以不可变的对象只能通过一定规范的编码实现。具体有这么几项要求:
- 声明class必须是final的;
- class 中的所有数据声明必须为private的;
- class中只提供取值函数(getter),不允许存在设值函数(setter);
- 在构造函数中设定class内含有的所有数据的值;
- 当涉及到可变对象的引用的时候,需要实施clone()。
通过以上可以看出,虽然immutable对象在同步机制中会获得好的性能,但它为支持不可变性所不得不实现的额外代码也是需要付出比较大的代价的!