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是可變類,但是狀態空間被設計的很小,可以創建他,調度,.....
但完成或取消後,就不能再重新調度它。