Effective Java第三章: 對所有對象都通用的方法

一、覆蓋equals方法時遵守通用約定

期望結果
  1. 類的每個實例本質上都是惟一的;
  2. 不關心類是否提供了“邏輯相等”的測試功能;
  3. 超類已經覆蓋了equals方法,從超類繼承過來的行爲對於子類也是合適的;
  4. 類是私有的或者是包級私有的,可以確定它的equals方法永遠不會被調用;
覆蓋equals方法時的通用約定
  1. 自反性:對於任何非null的引用值x,x.equals(x)必須返回true;
  2. 對稱性:對於任何非null的引用值x和y,當且僅當y.euqals(x)返回true,x.equals(x)返回true;
  3. 傳遞性:對於任何非null的引用值x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那麼e.euqals(z)也必須返回true;
  4. 一致性:對於任何非null的引用值x和y,只要equals的比較操作在對象中沒有被修改,多次調用x.equals(y)就一定會一致的返回true或者false;
  5. 對於任何非null的引用值x,x.equals(null)必須返回false;
實現高質量的equals方法的訣竅
  1. 使用==操作符檢查“參數是否爲這個對象的引用”;
  2. 使用instanceof操作符見笑哈“參數是否爲正確的類型”;
  3. 把參數換成正確的類型;
  4. 對於該類中每個“關鍵域”,檢查參數中的域是否與該對象中對應的域相匹配;
  5. 當你編寫完成equals方法之後,應該問自己三個問題:它是否是對稱的、傳遞的、一致的?
  6. 覆蓋equals方法是總要覆蓋hashCode;
  7. 不要企圖讓equals方法過於智能;
  8. 不要將equals聲明中的Object對象替換爲其他的類型;

二、覆蓋equals方法時總要覆蓋hashCode

三、始終覆蓋toString方法

四、謹慎覆蓋clone方法

五、考慮實現Comparable接口


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章