Effective Java我們都知道,這本書是編寫高效可維護的java代碼最重要的書籍。雖然Android使用java寫的,但是書里的建議也不一定就完全適用。甚至有些人認為大部分建議都不適用于Android開發。在我看來,由于Android中使用的虛擬機(Dalvik/ART)與傳統的JVM有差異,所以某些java的優化如enums、serialization等在Android中不很適用。當然,書中的很多建議經過一些小修改,可幫助我們開發出更健壯、整潔、可維護的代碼。
這篇文章里我介紹下我認為書中適合于Android開發的比較重要的幾點。對于讀過這本書的人可以溫習一下,沒讀過的可以學習一下。
強制不能生成實例
如果不希望使用new 關鍵詞創建對象,則可以把構造函數的訪問權限設置為private
,尤其是那些只包含靜態方法的工具類。
靜態工廠
使用靜態工廠方法代替new
關鍵詞創建對象,工廠方法通過不同的命名可以根據需要返回不同的子類對象,而且如果需要可以不用每次都創建新對象。
[Update] 一個讀者提出一個建議:使用靜態工廠后不方便測試,如果是這樣,可以在測試期通過使用非靜態工廠來模擬。
Builders
當構造方法中有超過三個參數時,可以考慮使用builder去構建對象,可能有些繁瑣,但是這樣易于擴展且可讀性更強。如果是創建一個 value class,可以使用AutoValue
避免可變
不可變指一個對象在其生命周期中保持相同的值,在創建時就設置來所有需要的值。這樣做的好處很多,比如線程安全、可共享等。
但是不能所有對象都是不可變的,所以要盡力做到(比如定義private final成員變量,final類)。
靜態內部類
如果創建內部類時不依賴外部類,一定要定義為靜態類,否則內部類的實例會持有外部類實例的引用。
使用泛型
我們應該感謝Java的類型安全(對比JS),盡量保證編譯期的類型安全:
不要忘記方法的參數和返回值可以使用泛型:
還可以使用受限的通配符來限制類型的上下界:
返回空值
如果有一個方法的返回值類型是List/collection,不要返回null,可以返回一個空collection:
不要使用"+"操作String
當只有少數String時,可以考慮使用 "+",當數量較多時,考慮使用StringBuilder:
異常恢復
我不支持為了指示錯誤而拋出異常,如果你想這樣做,最好保證程序可以從異常恢復:
總結
文章中沒有包含書里所有的建議,僅僅是其中一些比較實用的tips的備忘錄。
原文地址Effective Java for Android (cheatsheet)
推薦閱讀: