標籤:java 類
本章描述的是,自己在做系統重構的時候,閱讀的章節,給自己在架構方面提供很大協助。總結出一些乾貨分享一下啊啊啊~~主要應用情境是編寫類與介面的時候需要注意的問題。每一章不一定按照順序更新。歡迎拍磚補充。
1.類與成員的存取權限最小化。Public staticfinal 如果指向的是對象(數組也是對象),那麼往往是錯誤的寫法,【private static final A=指向該對象,同時採用public static final指向A.clone()(A的副本)】【private staticfinal A=指向該對象,public static final List通過Collections.unmodifiableList(Arrays.asList(A))返回一個List列表,存放數組】
2.在公有類使用存取方法而非開放資料域,即公有類不應該暴露可變域。例如javabean採用setter/getter方法來操作對象資料域
3.複合優於繼承,將繼承類當做一個組件放到複合類中,通過一系列轉寄方法實現繼承類。然後通過外界函數調用此複合類。
4.要麼為繼承而設計,並提供文檔說明,要麼就禁止繼承。禁止繼承,可以通過final,以及構造器私人化完成。如果需要繼承,那麼需要考慮繼承類在任何時候不能調用該類可覆蓋的方法,可以機械消除可覆蓋方法的自用特性,通過將該覆蓋的方法代碼複製一份私人輔助方法。通過調用私人輔助方法消除自用特性。
5.介面優於抽象類別,抽象類別是為繼承而設計的,抽象類別演變比介面容易的多,例如,後期需要增加方法,抽象類別可以,但介面卻不行。
6.介面只用於定義類型,例如常量介面是對介面的不良使用。對於常量的設計,如果常量緊密關聯某一個類,將寫入該類內部。如果能看錯枚舉常量就用枚舉代替。否則將採用不可執行個體化的工具類來匯出這些常量。
7.類層次優於標籤類。如果代碼中存在根據某一個標誌位而產生不同的方法結果,也就是代碼模板,那麼需要考慮是否可以層次化代碼,將模板代碼提取為抽象類別中的方法進行類層次化。
8.用函數對象表示策略,函數對象作為參數傳遞到方法,代表著java中的“指標”,通過可以將函數對象採用介面的形式來封裝成策略,提供一個 “宿主類”通過一個公有的靜態方法來調用私人的靜態成員,該靜態成員就是此策略的實現方式。
在系統架構編碼的時候優先能統一為介面嗎?該類能使用複合嗎?該類是一定被繼承下去的,採用抽象類別可以嗎?其他類能繼承嗎?該類編寫前,X屬效能public嗎?大致就這些一般性思考方向。
Effective java經驗之談,類與介面