第八條:覆蓋equals時請遵守通用約定
Object類中默認的equals如下:
public boolean equals(Object obj) {
return (this == obj);
}
如果類不覆蓋equals方法,在這種情況下,類的每個實例都只與它自身相等。
- 什麼時候不需要覆蓋equals方法
- 類的每個實例本質上都是唯一的。
- 不關心類是否提供了“邏輯相等”的測試功能。
- 超類已經覆蓋了equals,從超類繼承過來的行爲對於子類也是合適的。
- 類是私有的或是包級私有的,可以確定它的equals方法永遠不會被調用。
- 什麼時候需要覆蓋equals方法
在覆蓋equals方法的時候,必須要遵守它的通用約定:
equals方法實現了等價關係(equivalence relation):
- 自反性(reflexive)
- 對稱性(symmetric)
- 傳遞性(transitive)
- 一致性(consistent)