函数做法,不改变对象本身;
过程或命令做法,改变对象本身数据.
不可变对象比较简单,因为其只有初始化时的状态,如果你能确保所有的构造器都建立这个类的约束关系,就可以确保约束关系在对象整个生命过程中不变.
不可变对象本质上是线程安全的,它们不要求同步,不可变对象可以被自由地共享.鼓励客户端尽可能重用现有对象.
如何做到这一点呢?
1.频繁用到的值,提供公有静态final常量.
2.对1的拓展,提供静态工厂,把频繁使用的对象缓存起来.
不可变对象可以自由共享的影响是,永远不需要进行保护性拷贝.因为拷贝的对象永远是原始对象.
不可变对象为其他对象提供大量的构件,无论可变还是不可变的对象.如果知道复杂类的内部组件对象不会改变,要维护它的不变性约束比较容易.
不可变类真正唯一的缺点,对于每个不同的值都需要单独的对象,代价比较高昂.
情景:如果执行多步骤操作,并且每个步骤都会产生新对象,除最终结果,其他都会被丢弃.性能问题摆在眼前,要如何处理呢?
方式1.猜测经常用到哪些操作,将它们做基本类型提供,那么不可变类不必为每个步骤创建新的对象;
方式2.如果可以预测执行哪些操作,使用包级私有可变配套类;如果不能准确预测,最好的办法提供公有的可变嵌套类.如String的可变配套类是StringBuilder.