EffectiveJava之13-支持非可变性

来源:互联网 发布:大数据 书籍 编辑:程序博客网 时间:2024/05/21 22:39

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是可变类,但是状态空间被设计的很小,可以创建他,调度,.....

但完成或取消后,就不能再重新调度它。

 

0 0