整理 Effective Java 書中 Item 15: Minimize the accessibility of classes and members 心得筆記
主旨
在 Java 中設計良好的元件,首要原則是資訊隱藏(information hiding),也稱為封裝(encapsulation)。簡單來說,就是把類別的內部細節封起來,讓外部只能透過定義好的 API 存取必要功能。這可以降低系統各部分之間的耦合,提升開發效率、維護性與模組重用性。
整理 Effective Java 書中 Item 15: Minimize the accessibility of classes and members 心得筆記
在 Java 中設計良好的元件,首要原則是資訊隱藏(information hiding),也稱為封裝(encapsulation)。簡單來說,就是把類別的內部細節封起來,讓外部只能透過定義好的 API 存取必要功能。這可以降低系統各部分之間的耦合,提升開發效率、維護性與模組重用性。
整理 Effective Java 書中 Item 14: Consider implementing Comparable 心得筆記
如果你的類別有「自然順序」(例如時間、數字、字母順序),實作 Comparable
介面將大大提升它的實用性。這麼做可以讓物件支援排序、搜尋、去重,並輕鬆整合進 TreeSet、TreeMap、Arrays.sort 等 API 中,幾乎所有 Java 的值物件(例如 String、BigDecimal、Enum)都有實作 Comparable。
clone()
方法整理Effective Java書中Item 13: Override clone judiciously 心得筆記
Cloneable
介面的目的是讓類別宣告它們允許複製物件,然而它的設計有許多缺陷。本文將介紹如何正確覆寫 clone()
方法,並探討 Cloneable
介面的問題與替代方案。
Cloneable
介面的缺陷:Cloneable
介面本身不包含任何方法,且 Object
類別的 clone()
方法是受保護的,因此直接調用 clone()
方法可能會失敗。clone()
方法應該返回物件的副本,且相同物件的副本應該擁有相同的 hashCode
,並且與原物件不同。clone()
方法:覆寫 clone()
方法的類別必須遵循一些複雜且難以強制執行的協議,並且在某些情況下,clone()
方法可能並不是最佳的選擇。clone()
方法更可靠的物件複製方法。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()
,生成的診斷訊息可能完全沒有幫助。整理Effective Java書中Item 11: Always override hashCode when you override equals 心得筆記
當覆寫 equals()
方法時,必須同時覆寫 hashCode()
。如果不這麼做,將違反 hashCode
的契約,並且可能會在 HashMap
和 HashSet
等集合中出現異常行為。
hashCode
方法的契約hashCode()
方法,若該物件的 equals()
比較資訊未修改,則應該返回相同的結果。equals()
方法比較為相等,則兩者的 hashCode()
必須相同。hashCode()
必須不同。不過,為不相等的物件產生不同的哈希碼有助於提高散列表的效能。