相關讀書筆記列表
NO.13 支援非可變性
為了使一個類成為非可變類,要遵循下面五條規則:
①不要提供任何會修改對像的方法;
②保證沒有可被子類改寫的方法;
③使所有的域都是final的;
④使所有的域都成為私人的;
⑤保證對於任何可變組件的互斥訪問。(如果一個類指向可變對象的域,則必須確保該類的客 戶無法活得指向這些對象的引用,並且永遠不要用客戶提供的對象引用來初始化這樣的域,也不要在任何一個存取方法中返回該對象的引用);
以上規則比真正的要求強了一點,為了提高效能可以有所方式,如:保證沒有一個方法能夠對對象的狀態產生外部可見的改變,許多非可變的類擁有一個或者多個非final的冗餘域,把一個開銷昂貴的計算結果緩衝在這些域中。
非可變對象本質上是安全執行緒的,它們不要求同步。非可變對象可以被自由地共用。你不僅可以共用非可變對象,甚至也可以共用它們的內部資訊。非可變對象為其他對象--無論是可變的還是不可變的--提供了大量的構件。
非可變類真正唯一的缺點是,對於每一個不同的值都要求一個單獨的對象。String就是這樣的。通常有個解決的辦法就是提供一個協助類來彌補,例如StringBuffer類。
如果一個類不能被做成非可變類,那麼你仍然應該儘可能地限制它的可變性。
建構函式應該建立完全初始話的對象,所有的約束關係應該在這時候建立起來,建構函式不應該吧“只構造看一部分的執行個體”傳遞給其他的方法,不應該在後者函數之外子踢狗一個公有的初始化方法。
使一個類成為非可變類有如下三種方法:
①將一個類聲明為final類型的;
②讓該類中的每一個方法都成為final的,這種方法的好處在於其子類可以繼續擴充新的方法;
③把類的建構函式聲明為私人的或者包級私人的,增加靜態Factory 方法,來代替公有的建構函式;(該方法雖然不常用,但卻是最值得推薦的)
NO.14 複合優先於繼承
實現代碼重用最重要的辦法就是繼承,但是繼承破壞了封裝,導致軟體的鍵壯性不足。如果子類繼承了父類,那麼它從父類繼承的方法就依賴父類的實現,一旦他改變了會導致不可預測的結果。如果子類和超類在不同的包中,並且超類並不是為了擴充而設計的,那麼繼承會導致脆弱性。作者介紹了InstrumentedHashSet作為反例進行說明,原因就是沒有明白父類的方法實現。作者給出的解決辦法是通過化合來代替繼承,尤其是當存在一個適當的介面來實現一個封裝類的時候,用封裝類和轉寄方法來解決問題。把想擴充的類作為本類的一個private
final得成員變數。把方法參數傳遞給這個成員變數並得到傳回值。這樣做的缺點是這樣的類不適合回掉架構。繼承雖然好,我們卻不應該濫用,只有我們能確定它們之間是is-a得關係的時候才使用。