EffectiveJava之13-支持非可變性

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是可變類,但是狀態空間被設計的很小,可以創建他,調度,.....

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章