1、 非可变类要遵循的5条规则:
a) 不要提供任何可能会修改对象的方法;
b) 保证没有可以被子类修改的方法;
c) 使所有域都为final的;
d) 使所有的域都成为私有;
e) 保证对任何的可变组件的互斥访问。(如果类中有可变对象的引用,则要保证客户无法得到这些对象的引用,并且不要用客户提供的对象来初始化这些域。
在构造函数、访问方法、readObject方法中使用保护性拷贝(defensive copy)。
2、 函数的方法,来实现非可变对象。一个非可变对象只有一个状态,就是最初被创建时刻的状态。
3、 非可变对象本质上是线程安全的
4、 有些非可变类有可变配套类,如string stringbuffer
5、 对于一个非可变类 除了在class前加final ,另一个做法就是 将类中的每一个方法都编程final,好处是:可以扩展这个类。在原来的基础上增加新的方法。
这样的效果和 “在一个独立的、不可被实例化的工具类中增加了新的静态方法”相同。所以此方法不被提倡。
6、 使一个非可变类变为final的另一个替代方法是:是构造函数私有化,并提供静态工程来替代构造函数。
7、 静态工厂的好处是 可以为同样的参数,提供不同的构造,只需要提供第二种静态工厂即可。比如:
Private complex(float x,float y){}
Public static complex valueOf(float x,float y){
Returnnew complex(x,y);}
Public static complex valueOfPolar(float x,float y){
Returnnew complex(x*cos(theta),
Y*sin(theta));}
8、 若非可变类实现了Serializable,并且他包含一个或多个指向可变对象的域,这必须要提供一个readObject或readResolve方法。
9、 不要为每一个getXX() 都设置setXX(),尽量设计成非可变的,
10、 TimerTask是可变类,但是状态空间被设计的很小,可以创建他,调度,.....
但完成或取消后,就不能再重新调度它。