以下的一些規則是建立不可變對象的簡單政策。并非所有不可變類都完全遵守這些規則,不過這不是編寫這些類的程式員們粗心大意造成的,很可能的是他們有充分的理由確定這些對象在建立後不會被修改。但這需要非常複雜細緻的分析,并不适用于初學者。
不要提供setter方法。(包括修改字段的方法和修改字段引用對象的方法)
将類的所有字段定義為final、private的。
不允許子類重寫方法。簡單的辦法是将類聲明為final,更好的方法是将構造函數聲明為私有的,通過工廠方法建立對象。
如果類的字段是對可變對象的引用,不允許修改被引用對象。
不提供修改可變對象的方法。
不共享可變對象的引用。當一個引用被當做參數傳遞給構造函數,而這個引用指向的是一個外部的可變對象時,一定不要儲存這個引用。如果必須要儲存,那麼建立可變對象的拷貝,然後儲存拷貝對象的引用。同樣如果需要傳回内部的可變對象時,不要傳回可變對象本身,而是傳回其拷貝。
将這一政策應用到synchronizedrgb有以下幾步:
synchronizedrgb類有兩個setter方法。第一個set方法隻是簡單的為字段設值(譯者注:删掉即可),第二個invert方法修改為建立一個新對象,而不是在原有對象上修改。
所有的字段都已經是私有的,加上final即可。
将類聲明為final的
隻有一個字段是對象引用,并且被引用的對象也是不可變對象。