读书笔记 仅供参考
不可变类
不可变类就是实例不能被修改的类,每个实例中包含的所有信息都必须在创建该实例的适合提供,并一直固定不变
不可变类比可变类更加易于设计、实现和使用,不容易出错,且更加安全
五条规则
- 不提供任何修改对象状态的方法
- 保证类不会被扩展
- 所有域都是 final
- 所有域都是私有
- 确保对于任何可变组件的互斥访问(对可变对象的引用)
函数的做法
方法返回一个函数的结果,函数对操作数进行运算但是并不修改它
public Complex add(Complex c) {
return new Complex(re + c.re, im + c.im);
}
不可变对象的优点
- 不可变对象比较简单,只有一种状态
- 不可变对象本质上是线程安全的,不要求同步
- 不可变对象可以被自由地共享
- 不可变对象为其他对象提供了大量的构件
缺点
每一个不同的值都需要一个单独的对象,如果创建对象的代价太大,就会造成浪费。
如果执行一个多步骤的操作,并且每一个步骤都会产生一个新的对象,那么就会出现性能问题,解决方案
- 猜测会经常用到哪些多步骤的操作,将它们作为基本类型提供。
设计方案
使类不允许自身被子类化:
- 使类成为 final
- 让类的所有构造器都变成私有的或者包级私有的,并添加公有的静态工厂代替公有的构造器