Effective Java Item15 最小化類別與成員的可存取性

整理 Effective Java 書中 Item 15: Minimize the accessibility of classes and members 心得筆記

主旨

在 Java 中設計良好的元件,首要原則是資訊隱藏(information hiding),也稱為封裝(encapsulation)。簡單來說,就是把類別的內部細節封起來,讓外部只能透過定義好的 API 存取必要功能。這可以降低系統各部分之間的耦合,提升開發效率、維護性與模組重用性。

Read more

Effective Java Item14 考慮實作 Comparable

整理 Effective Java 書中 Item 14: Consider implementing Comparable 心得筆記

主旨

如果你的類別有「自然順序」(例如時間、數字、字母順序),實作 Comparable 介面將大大提升它的實用性。這麼做可以讓物件支援排序、搜尋、去重,並輕鬆整合進 TreeSet、TreeMap、Arrays.sort 等 API 中,幾乎所有 Java 的值物件(例如 String、BigDecimal、Enum)都有實作 Comparable。

Read more

Effective Java Item 13 - 明智地覆寫 clone() 方法

整理Effective Java書中Item 13: Override clone judiciously 心得筆記

主旨

Cloneable 介面的目的是讓類別宣告它們允許複製物件,然而它的設計有許多缺陷。本文將介紹如何正確覆寫 clone() 方法,並探討 Cloneable 介面的問題與替代方案。

劃重點

  1. Cloneable 介面的缺陷Cloneable 介面本身不包含任何方法,且 Object 類別的 clone() 方法是受保護的,因此直接調用 clone() 方法可能會失敗。
  2. 複製的契約clone() 方法應該返回物件的副本,且相同物件的副本應該擁有相同的 hashCode,並且與原物件不同。
  3. 何時覆寫 clone() 方法:覆寫 clone() 方法的類別必須遵循一些複雜且難以強制執行的協議,並且在某些情況下,clone() 方法可能並不是最佳的選擇。
  4. 替代方案:使用複製建構函數或工廠方法:複製建構函數或工廠方法提供了比 clone() 方法更可靠的物件複製方法。
Read more

Effective Java Item 12 - 始終覆寫 toString() 方法

整理Effective Java書中Item 12: Always override toString心得筆記

主旨

Object 提供了一個 toString() 方法的預設實作,但它返回的字串通常不是使用者希望看到的。預設返回的字串由類名及其哈希碼的十六進制表示組成,例如:PhoneNumber@163b91。這樣的格式雖然簡潔,但與 707-867-5309 比起來,並不具備足夠的資訊。

toString() 方法的通用契約指出,返回的字串應該是「簡潔且具資訊量的,且容易閱讀的格式」,但 PhoneNumber@163b91 這樣的字串雖簡潔,卻缺乏實際意義。契約還強調:「建議所有子類別都應該覆寫此方法」,這確實是個好建議!

劃重點

為什麼覆寫 toString() 方法很重要?

  • 調試與可讀性toString() 方法在調試時非常有用,當物件被傳遞給 println()printf()、字串連接運算符或 assert,或是由除錯器印出時,toString() 會自動被呼叫。如果沒有覆寫 toString(),生成的診斷訊息可能完全沒有幫助。
Read more

Effective Java Item 11 - 當覆寫 equals 方法時,總要覆寫 hashCode 方法

整理Effective Java書中Item 11: Always override hashCode when you override equals 心得筆記

主旨

當覆寫 equals() 方法時,必須同時覆寫 hashCode()。如果不這麼做,將違反 hashCode 的契約,並且可能會在 HashMapHashSet 等集合中出現異常行為。

劃重點

hashCode 方法的契約

  1. 一致性:在同一個應用程式執行期間,多次調用同一物件的 hashCode() 方法,若該物件的 equals() 比較資訊未修改,則應該返回相同的結果。
  2. 相等的物件具有相等的哈希碼:若兩個物件根據 equals() 方法比較為相等,則兩者的 hashCode() 必須相同。
  3. 不相等的物件不必具有不同的哈希碼:如果兩個物件不相等,則不要求它們的 hashCode() 必須不同。不過,為不相等的物件產生不同的哈希碼有助於提高散列表的效能。
Read more