覆蓋equals時遵守通用約定

2021-08-14 19:09:42 字數 795 閱讀 4086

不覆蓋equals時,類的每個例項都只與它自己相等。

如果類有自己的邏輯相等概念,且超類未覆蓋equals以實現期望的行為,這時需覆蓋equals。

約定內容:

1.自反性----對於任何非null的引用值x,x.equals(x)必須返回true

2.對稱性----對於任何非null的引用值x和y,當且僅當y.equals(x)返回true時,x.equals(y)必須返回true

3.傳遞性----對於任何非null的引用值x,y和z,如果x.equals(y)返回true,且y.equals(z)返回true,則x.equals(z)返回true

4.一致性----對於任何非null的引用值x和y,只要在equals的比較操作中所用資訊未被修改,多次呼叫返回一致結果

5.非空性----對於任何非null的引用值x,x.equals(null)必須返回false

我們無法在擴充套件可例項化的類的同時,既增加新的值元件,又同時保留equals約定。

可以考慮使用復合替代繼承。

可以在乙個抽象類的子類中增加新的值元件,而不會違反equals約定。

不要使equals方法依賴於不可靠的資源。

訣竅:1.使用==操作符檢查「引數是否為這個物件的引用」

2.使用instanceof操作符檢查「引數是否為正確的型別」

3.把引數轉換成正確的型別

4.對於該類中的每個關鍵域,檢查引數中的域是否與該物件中對應的域相匹配

5.為了提高equals方法的效能,優先比較最有可能不一致的域,或者開銷最低的域

6.檢查是否滿足對稱,傳遞,一致

覆蓋equals時遵守通用約定

類的每個例項都只與它自身相等。1,類的每個例項本質都是唯一的。2,不關心類是否提供了 邏輯相等 的測試功能。3,超類以及覆蓋了equals,從超類繼承過來的行為對於子類也是合適的。4,類是私有的或是包級私有的,可以確定它的equals方法永遠不會被呼叫。equals方法實現了等價關係 1,自反性。x...

Java學習筆記 覆蓋equals時請遵守通用約定

不覆蓋equals的情況 1 類的每個例項本質上是唯一的 2 不關心類是否提供了 邏輯想等 的測試功能 3 超類已經覆蓋了equals,從超類繼承過來的行為對於子類也是合適的 4 類是私有的或包級私有的,可以確定他的equals方法永遠不會被呼叫。應該覆蓋equals的情況 如果類具有自己特有的 邏...

第9條 覆蓋equals時總要覆蓋hashCode

在每乙個覆蓋equals方法的類中,都必須覆蓋hashcode方法,如果不這麼做,會導致這個類無法結合所有基於雜湊的集合的正常使用,如hashmap,hashset,hashtable。object規範中有這麼一條 如果兩個物件根據equals object 方法比較是相等的,那麼呼叫這物件中任意乙...