Effective Java 讀書筆記: Item 8 - 覆寫 equals 時的注意事項

記錄讀書心得, 內容不一定和書上一致, 有些是我自己的看法。

先看個範例, 取自 AbstractSet 補加個 @Override:
@Override  // #1
    public boolean equals(Object o) {
        if (o == this)  // #2
            return true;

        if (!(o instanceof Set))  // #3
            return false;
        Collection c = (Collection) o;  // #4
        if (c.size() != size())  // #5
            return false;
        try {
            return containsAll(c);  // #6
        } catch (ClassCastException unused)   {
            return false;
        } catch (NullPointerException unused) {
            return false;
        }
    }
覆寫 equals 時的注意事項:
  1. 加 @Override 確保沒覆寫錯 method, 常見錯誤是參數寫成 MyClass o
  2. 先比 reference, 比較有效率
  3. 再來要檢查型別。由於 null 不屬於任何 class 或 interface, 用 instanceof 也可確保傳入的物件不是 null, 不必多加一步檢查 null
  4. 若是 interface 就轉 interface, 再用 method 比較; 若是 class 就能直接取 field 比值。比 field 時可用這個寫法同時考慮 null 的情況:
    (field == o.field || (field != null && field.equals(o.field))) 
  5. 先比低運算成本的項目。hashCode 或一些 summary value 是不錯的選擇
  6. 再比高運算成本的項目
  7. 寫 unit test 檢查 symmetric、transitive、consistent
  8. 有覆寫 equals 時, 一定要覆寫 hashCode (見 item 9)

留言

這個網誌中的熱門文章

(C/C++ ) 如何在 Linux 上使用自行編譯的第三方函式庫

熟悉系統工具好處多多

virtualbox 使用 USB 裝置