2020/07/07

[筆記] Effective Java #10 覆寫 equals 時請遵守通用約定(下)

Effective Java 3rd 簡體中文版筆記 #10 覆寫 equals 時請遵守通用約定
上一篇討論覆寫 equals 時會遇到的問題,本篇來討論如何正確的覆寫 equals
  1. 使用 == 來檢查,參數是否為本身的引用,如果是就不需要執行後續的比較,像 x.equals(x) 就馬上回傳 true。
  2. instanceof 來檢查參數是否為正確型態,若不是就回傳 false。
  3. 將參數轉型為正確的型態。
  4. 對於該 class 的每個 field,檢查是否與參數的 field 相同。當 field 的型態是物件時,為避免 NullPointerException 的發生,所以建議使用 Objects.equals(Object, Object) 來比較,或是確定不為 null 的情況下,調用物件的 equals 來比對。在處理像是 float 及 double 等數值時,要用 Float.compareDouble.compare 來處理。
equals 中的比對順序將會影響效能,所以應先比對成本低且容易不同的 field,一旦 field 不同,就回傳 false 並結束比對,這樣比對成本高的 field 可以減少比對次數。在覆寫完成後,要檢查對稱性、遞移性及一致性等規則。

另外需要注意額外的幾件事:
  1. 覆寫 equals 時,總是要覆寫 hashCode,下一篇會討論。
  2. 不要讓 equals 過度複雜化,審慎評估是否有覆寫的必要。
  3. 不要將 equals 方法傳入的參數更變型態。
轉載請註明原文網址 https://cookieandcoketw.blogspot.com/2020/07/effective-java-10-override-equals-2.html

沒有留言:

張貼留言