Item 8 ~ 12講了Methods Common to All Objects,Object類里面的一些不是final的方法。
這篇講的是override equals方法的時候要遵守的約定。
首先,如果不需要覆寫那是最好的,如果滿足了下面的條件就不需要覆寫:
不需要override的情況:
- Each instance of the class is inherently unique
比如Thread代表活動實體,而不是值(不懂)。 - 不關(guān)心類是否提供「邏輯相等」的測試功能。
- superclass已經(jīng)覆寫了equals。
- 類是私有的,可以確定equals不會被調(diào)用。
需要覆寫的情況
如果類有自己的「邏輯相等」概念的話。比如String,不但要比對instance,還要比對每個char是否一致,instance一致自然是相等的(自反性reflexive),instance不相等,每個char相等,也返回true。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = count;
if (n == anotherString.count) {
int i = 0;
while (n-- != 0) {
if (charAt(i) != anotherString.charAt(i))
return false;
i++;
}
return true;
}
}
return false;
}
覆寫的時候需要遵守的general contract
- reflexive
x.equals(x) must be true - symmetric
x.equals(y) must be the same as y.equals(x) - transitive
x-->y-->z - consistent
多次調(diào)用結(jié)果一致。 - 非null類型的引用,x.equals(null)必須返回false
注意
這些contract看似很容易符合,但是文中對每個情形都舉了反例,告訴讀者這些條件是很容易不知不覺見違反的。具體可看文末鏈接。
當(dāng)完成編寫之后,要編寫單元測試來驗證上面的這些特性。
See also:
http://blog.csdn.net/partner4java/article/details/7066349