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