優秀程式碼的必知必會(一)?

清塵閒聊發表於2019-04-18

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

靜態工廠方法的優點:
不像構造方法,它是有名字的。
它不需要每次呼叫時都建立一個新物件。
它可以返回 其返回型別的任何子型別的物件。
返回物件的類可以根據輸入引數的不同而不同。
在編寫包含該方法的類時,返回的物件的類不需要存在。

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

當一個物件中,屬性過多時,使用構造方法時,引數過多導致難以維護,並且很難讀懂每個引數的含義是什麼。

使用 構造方法 來構建必傳引數,而用 setter 的方式來傳可選引數呢?這看似引數少,建立例項也很容易,並且所生成的程式碼也易於閱讀。但由於 JavaBeans 模式本身有嚴重的缺陷,由於構造方法在多次呼叫中被分割,導致 JavaBeans 可能處於不一致的狀態,並且還需要額外增加工作以確保執行緒安全。

最好處理引數過多的方法是使用 builder 模式,它結合了可伸縮構造方法模式的安全性和 JavaBeans 模式的可讀性,然後在呼叫 builder 物件的 setter 相似方法來設定每個可選引數。

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

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

4.不要建立不必要的物件

如果物件是不可變的,它總是可以被重用的,比如 String 類是 final 的,不可變的,最好不要用 new String("test"), 因為它每次都會建立一個新的物件。在效能有嚴格要求的情況下,優先使用基本型別而不是裝箱的基本型別,也要注意無意識的自動裝箱,因為它們會影響效能。

5.消除過期的物件引用

這個也就是常說的記憶體洩露。當一個類自己管理記憶體時,應該警惕記憶體洩漏問題。 每當一個元素被釋放時,元素中包含的任何物件引用都應該被清除。

另一個常見的記憶體洩漏來源是快取。一旦將物件引用放入快取中,很容易忘記它的存在,可以用 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。

每次重寫 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:
清山綠水始於塵,博學多識貴於勤。
我有酒,你有故事嗎?
微信公眾號:「清塵閒聊」。
歡迎一起談天說地,聊程式碼。

優秀程式碼的必知必會(一)?

相關文章