優秀代碼的必知必會(一)?

1.使用靜態工廠方法替代構造方法

靜態工廠方法的優勢:
不像構造方法,它是有名字的。
它不須要每次調用時都建立一個新對象。
它能夠返回 其返回類型的任何子類型的對象。
返回對象的類能夠根據輸入參數的不一樣而不一樣。
在編寫包含該方法的類時,返回的對象的類不須要存在。緩存

2.當構造方法參數過多時請使用 builder 模式

當一個對象中,屬性過多時,使用構造方法時,參數過多致使難以維護,而且很難讀懂每一個參數的含義是什麼。安全

使用 構造方法 來構建必傳參數,而用 setter 的方式來傳可選參數呢?這看似參數少,建立實例也很容易,而且所生成的代碼也易於閱讀。但因爲 JavaBeans 模式自己有嚴重的缺陷,因爲構造方法在屢次調用中被分割,致使 JavaBeans 可能處於不一致的狀態,而且還須要額外增長工做以確保線程安全。微信

最好處理參數過多的方法是使用 builder 模式,它結合了可伸縮構造方法模式的安全性和 JavaBeans 模式的可讀性,而後在調用 builder 對象的 setter 類似方法來設置每一個可選參數。性能

3.使用依賴注入的方式注入資源

依賴注入的實踐將極大地加強類的靈活性、可重用性和可測試性。測試

4.不要建立沒必要要的對象

若是對象是不可變的,它老是能夠被重用的,好比 String 類是 final 的,不可變的,最好不要用 new String("test"), 由於它每次都會建立一個新的對象。在性能有嚴格要求的狀況下,優先使用基本類型而不是裝箱的基本類型,也要注意無心識的自動裝箱,由於它們會影響性能。ui

5.消除過時的對象引用

這個也就是常說的內存泄露。當一個類本身管理內存時,應該警戒內存泄漏問題。 每當一個元素被釋放時,元素中包含的任何對象引用都應該被清除。spa

另外一個常見的內存泄漏來源是緩存。一旦將對象引用放入緩存中,很容易忘記它的存在,能夠用 WeakHashMap 來表示緩存。線程

6.避免使用 Finalizer 和 Cleaner 機制,請使用 try-with-resources 語句

用於 Finalizer 和 Cleaner 機制的不肯定性,咱們不知道它到底什麼時候會執行。例如,依賴於 Finalizer 和 Cleaner 機制來關閉文件是嚴重的錯誤,由於打開的文件描述符是有限的資源。 若是因爲系統遲遲沒有運行 Finalizer 和 Cleaner 機制而致使許多文件被打開,程序可能會失敗,由於它不能再打開文件了。能夠用 try-with-resources 語句 或 try-finally 語句,當打開多個文件時,try-finally 語句的可讀性就不如 try-with-resources 語句,所以推薦使用 try-with-resources 語句。設計

7.重寫 equals 方法時同時也要重寫 hashcode 方法

重寫 equals 方法時,須要知足如下特性。
自反性:一個對象必須與自身相等。
對稱性:任何非空引用 x 和 y,若是且僅當 y.equals(x) 返回 true 時 x.equals(y) 必須返回 true。
傳遞性:若是第一個對象等於第二個對象,第二個對象等於第三個對象,那麼第一個對象必須等於第三個對象。
一致性:若是兩個對象是相等的,除非一個(或兩個)對象被修改了, 那麼它們必須始終保持相等。
非空性:對於任何非空引用 x,x.equals(null) 必須返回 false。code

每次重寫 equals 方法時都必須重寫 hashCode 方法,不然程序將沒法正常運行。 hashCode 方法必須聽從 Object 類指定的常規約定,將不一樣的哈希碼分配給不一樣的實例對象。

8.始終重寫 toString 方法

Object 類提供了 toString 方法的實現是包名+類名+@+哈希碼的無符號十六進制。toString 的通用約定要求,返回的字符串應該是「一個簡潔但內容豐富的表示,對人們來講是很容易閱讀的」。就須要 toString 方法,方即可讀性。

9.考慮實現 Comparable 接口

在須要可比較的場景中,最好實現 Comparable 接口,以便在基於比較的集合中輕鬆對其實例進行排序,搜索和使用。 比較 compareTo 方法的實現中的字段值時,請避免使用"<"和">"運算符。 最好使用包裝類中的靜態 compare 方法或 Comparator 接口中的構建方法。

10.使類和成員的可訪問性最小化

一個優秀設計的組件隱藏了它的全部實現細節,乾淨地將它的 API 與它的實現分離開來。而後,組件只經過它們的 API 進行通訊,而且對彼此的內部工做一無所知。稱爲信息隱藏或封裝,是軟件設計的基本原則。

Java中的四種訪問級別:
private——只能本身訪問。
package-private——默認級別,同包中的任意類訪問。
protected——子類和本身能夠訪問。
public —— 任何類均可訪問。

PS:
清山綠水始於塵,博學多識貴於勤。
我有酒,你有故事嗎?
微信公衆號:「清塵閒聊」。
歡迎一塊兒談天說地,聊代碼。

相關文章
相關標籤/搜索