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

Effective Java Item 10 - 覆寫equals方法時必須遵守一般契約

整理Effective Java書中Item 10: Obey the general contract when overriding equals心得筆記

主旨

當覆寫 equals() 方法時,必須遵守其一般契約,這是設計 equals() 方法時的基本要求。如果不遵守這些規範,會導致難以預測的錯誤。

劃重點

equals() 方法的一般契約

  1. 對稱性:如果 a.equals(b) 返回 true,那麼 b.equals(a) 也應該返回 true
  2. 自反性:對於任何非 null 的參照變數 aa.equals(a) 必須返回 true
  3. 傳遞性:如果 a.equals(b) 返回 trueb.equals(c) 返回 true,那麼 a.equals(c) 必須返回 true
  4. 一致性:如果兩個物件相等,多次調用 a.equals(b) 應該返回相同的結果,前提是 b 沒有改變。
  5. null 的比較a.equals(null) 應該返回 false
Read more

Effective Java Item33 考慮使用類型安全的異質容器

整理Effective Java書中Item 33: Consider typesafe heterogeneous containers心得筆記

主旨

有時候你需要更靈活的容器來處理異質數據。本文介紹了如何使用類型安全的異質容器,讓程式碼既靈活又具安全性。

劃重點

  1. 異質容器的問題:異質容器可以存儲不同類型的物件,若不加以管理,容易導致類型錯誤。
  2. 使用泛型設計類型安全容器:透過泛型來確保容器內部元素的類型一致,避免運行時出現錯誤。
  3. 實現類型安全的異質容器:使用封裝類型來實現異質容器,使其可以存儲不同類型的物件,同時保證類型安全。
Read more

Effective Java Item32 明智地結合泛型和可變參數

主旨

將泛型和可變參數結合使用時可能會引發類型安全問題。本文將介紹如何避免這些問題,確保程式碼的安全性。

劃重點

  1. 泛型與可變參數結合的危險:可變參數是陣列,而陣列類型是可變的,這會導致類型不匹配問題。
  2. 使用 @SafeVarargs 註解:確保方法不會修改可變參數,並能抑制類型安全警告。
  3. 替代方案:使用 List:使用 List 代替可變參數,避免類型安全問題。
Read more