Methods Common to All Objects
item 7:當你覆蓋equals方法的時候一定要遵守general contact
覆蓋equals的時候一定要加倍的小心,其實最好的辦法就是不覆蓋這個方法。比如在下面的情況下就可以不覆蓋
1這個類的每個實例都是唯一的,例如Thread類
2 假如你不關心這個類是否該提供一個測試邏輯相等的方法
3超類已經覆蓋了equals方法,并且它合適子類使用
4假如這個類是PRivate或者是package-private的,并且你確信他不會被調用
但是當我們要為這個類提供區分邏輯相等和引用相等的方法的時候,我們就必須要覆蓋這個方法了。例如String類,Date類等,覆蓋的時候我們一定要遵從general contact,說白了就是一個合同。合同的主要內容是
1.x.equals(x)必須返回true
2.x.equals(y)當且僅當y.equals(x)返回true的時候返回true
3.x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)必須返回true
4.假如沒有任何修改得話 那么多次調用x.equals(y)的返回值應該不變
5.任何時候非空的對象x,x.equals(null)必須返回false
下面是作者的建議如何正確的覆蓋equals方法
1. 用==檢查是否參數就是這個對象的引用
2. 用instanceof判定參數的類型是否正確
3. 把參數轉換成合適的類型
4. 比較類的字段是不是匹配
例如:
public boolean equals(Object o)
{
if(o== this) return true;
if(!(o instanceof xxxx) return false;
新聞熱點
疑難解答