《Effective Java》是 Java 領域的經典之做,其影響力不亞於《Think in Java》。它是每一個 Java 開發者的必讀書籍,值得屢次閱讀品味,並不斷實踐其中的經驗技巧。程序員
兩年前讀過此書,當時自身技術水平並不算高,對於其中的原則不求甚解。如今重溫之前的筆記,加上這兩年的編程經驗,居然有種豁然開朗的感受。 「書讀百遍,其義自見。」古人說得有道理啊。編程
這裏簡單介紹幾條開發中常常用到的技巧,好比 Builder、對象方法、接口定義等。數組
這裏講的就是構建者模式,使用 Builder 給對象設置構造參數,從而去除重疊的構造方法。緩存
在第三方庫中,好比 OkHttp、Retrofit,常常見到這樣的設計。咱們用 Builder 設置參數,而後調用 build 方法構造對象,代碼看起來很是清爽,沒有多餘的構造參數,使用起來也方便。安全
若是類的構造方法中有多個參數,並且參數可選,Builder 模式是不錯的選擇。性能
單例模式推薦使用靜態內部類,保證線程安全的同時,延遲對象的初始化。枚舉的話,不是很推薦。優化
建立對象是有開銷的,對於不可變的(能夠理解爲無狀態的)對象,能夠始終被重用。善於使用緩存(cache)是好的習慣,咱們要作一個環保的程序員。好比 Android Message 裏面的對象池,就是一種優化策略。ui
優先使用基本數據類型而不是裝箱數據類型,由於基本類型佔用更少的內存空間,對於移動端來講,內存優化是一個永恆的話題。線程
對於通常的 Java Bean 對象,我都會重寫其 toString 方法, 這樣在打印日誌的時候,就能看見它的內部數據,這點很是有用。設計
對於須要做爲 HashMap 的鍵的對象,必定要重寫 hashCode 和 equals 方法,這樣有利於散列表均勻分佈,提高查找的性能。 另外,兩個對象 equals 相等,hashCode 必須相等;hashCode 相等,equals不必定相等。這個很好理解,equals 保證 HashMap 鍵的惟一性;hashCode 相等表示兩個對象放在 HashMap 數組的同一個位置上。
提示:如今的 IDE 實在是太傻瓜式了,能夠一鍵生成 toString, equals 和 hashCode 方法,這時候有什麼理由不重寫呢。
接口本質上是一種規範,用來定義通用的規則,而後各個功能提供者進行不一樣的實現。這裏,我想到了一條軟件設計原則--接口隔離,是說一個接口只用來定義一種規範,每一個接口都是獨立的,不能讓一個接口有多個定義。
骨架實現,AbstractXXX,爲抽象類提供了實現上的幫助,又不強加抽象類定義類型的限制。好比 Java 裏面的 AbstractList,是列表類的抽象實現,其子類有 ArrayList 和 LinkedList 等。
靜態成員類不持有外部類的引用,因此不會形成內存泄漏問題,主要是用來輔助外部類。還有匿名內部類,好比直接建立的 Runnable,建議內部保持簡短,大約 10 行或者更少些,不然影響程序的可讀性。
列表和數組的不一樣點:
數組提供了運行時的類型安全,可是沒有編譯時的類型安全。列表裏面有許多實用的方法,而數組就沒有提供哦。建議優先使用集合類型 List,而不是數組類型 E[]。
枚舉類型是實例受控的,它們是單例的泛化,本質上是單元素的枚舉。枚舉的優勢是易讀性好,更加安全,功能強大。可是與 int 類型相比,枚舉有些性能缺點:裝載和初始化枚舉時會有時間和空間的成本。在 Android 端,一般不建議使用。
for-each 循環在簡潔性和預防 bug 方面優於傳統的 for 循環,並且沒有性能損失,應該儘量地使用 for-each。
這一點深有感觸,IDE 一般會提示使用 for-each,畢竟簡潔就是美啊。
float 和 double 並無提供徹底精確的結果,因此不該該用於須要精確計算的場合,尤爲是貨幣計算。若是想要系統記錄十進制小數點,可使用 BigDecimal。
float 類型確實是個坑,常常會出現計算不許確的問題,通常推薦使用雙精度浮點型 double。
以上就是從《Effective Java》裏面摘錄的十條編程建議,還有好多幹貨呢,趕快去閱讀吧~