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;
xxx in = (xxx)o;
return ……..
}
最后一點要注意的時候不要提供這樣的方法public boolean equals(MyClass o)這樣是重載并不是覆蓋Object的equals方法
item 8 :當你覆蓋equals的時候必須覆蓋hashCode方法
這點必須切忌,不然在你和hash-based集合打交道的時候,錯誤就會出現了。關鍵問題在于一定要滿足相等的對象必須要有相等的hashCode。如果你在PhoneNumber類中覆蓋了equals方法,但是沒有覆蓋hashCode方法,那么當你做如下操作的時候就會出現問題了。
Map m = new HashMap();
m.put(new PhoneNumber(408,863,3334),”ming”)
當你調用m.get(new PhoneNumber(408,863,3334))的時候你希望得到ming但是你卻得到了null,為什么呢因為在整個過程中有兩個PhoneNumber的實例,一個是put一個是get,但是他們兩個邏輯相等的實例卻得到不同的hashCode那么怎么可以取得以前存入的ming呢。
Item 9:永遠覆蓋toString方法
在Object的toString方法返回的形式是Class的類型加上@加上16進制的hashcode。你最好在自己的類中提供toString方法更好的表述實例的信息,不然別人怎么看得明白呢。
Item 10:覆蓋clone()方法的時候一定要小心
一個對象要想被Clone,那么要實現Clone()接口,這個接口沒有定義任何的方法,但是如果你不實現這個接口的話,調用clone方法的時候會出現CloneNotSupportedException,這就是作者叫做mixin的接口類型。通常clone()方法可以這樣覆蓋
public Object clone()
{
try
{
return super.clone();
}
catch(CloneNotSupportedException e)
{}
}
但是當你要clone的類里面含有可修改的引用字段的時候,那么你一定要把整個類的藍圖進行復制,如果對你clone得到的對象進行修改的時候還會影響到原來的實例,那么這是不可取的。所以應該這樣clone()
public Object clone() throws CloneNotSupportedException
{
Stack Result = (Stack)super.clone();
Result.elements = (Object[])elements.clone();
Return result;
}
其中elements是stack類中可修改的引用字段,注意如果elements是final的話我們就無能為力了,因為不能給他重新賦值了.其實如果不是必須的話,根本就不用它最好。
Item 11:考慮適當的時候覆蓋Comparable接口
Thinking in java上說的更清楚,這里不多少了。