15:使可变性最小化
使用不可变类的理由
不可变类只是其实例不能被修改的类。不可变的类比可变类更加易于设计、实现和使用。它们不容易出错,且更加安全。
使类变成不可变类的几个规则
1.不要提供任何会修改对象状态的方法。
2.保证类不会被扩展。
3.使所有的域都是 final 的。
4.使所有的域都是私有的。
5.确保对于任何可变组建的互斥访问。
几个优点
1.不可变对象本质上是线程安全的,它们不要求同步
2.不可变类可以提供一些静态工厂,它们把频繁的请求的实例缓存起来,从而当现有实例可以符合请求的时候,就不必创建新的实例。
3.“不可变对象可以被自由的共享” ==> 永远不需要进行保护性拷贝。
4.不仅可以共享不可变对象,甚至也可以共享它们的内部信息。
5.不可变对象为其他对象提供了大量的构件,无论是可变的还是不可变的。
缺点
- 1.对于每一个不同的值都需要一个单独的对象
设计方案
1.使类是 final 的。
2.让类的所有构造器都是私有的或者包级私有的并添加公有的静态工厂来代替公有构造器。
3.坚决不要为每个 get 方法都提供一个 set 方法。
4.构造器应该创建完全初始化的对象,不要在构造器或者静态工厂之外再提供公有的初始化方法,除非有令人信服的理由必须这么做。
5.如果有的类不能做成不可变的,扔应该尽可能的限制它的可变性。
6.如果不可变类要实现 Serilizable 接口,并且它包含一个或者多个指向可变对象的域,就必须提供一个显示的 readObject 或者 readResolve 方法。(或者使用 ObjectOutputStream.writeUnshared 和 ObjectInputStream.readUnshared 方法)