首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Effective Java 學習筆記(八):equals、hashCode、toString 與 clone 的正確實踐

     編輯:Java 程式設計入門

重寫 equals 必須重寫 hashCode

這是因為要遵守 java.lang.Object 規範第二條:兩個根據 equals() 相等的對象,它們返回的 hashCode 值也必然相等。若你重寫了 equals() 方法,令兩個實際不是同一對象的兩個實例在邏輯上相等,但 hashCode 卻不等,會導致在 HashMap、Hashtable 等依賴 hashCode 的集合類中出現嚴重問題。如何寫好 hashCode 見仁見智,目前仍有科學家在研究優秀的雜湊演算法。

總是要重寫 toString()

雖無嚴格規定,不像 hashCode 那樣會帶來災難性陷阱,但 Java 建議重寫 toString()。因為這能給我們更好的習慣和風格。若不重寫,調用 toString() 將得到一串難以理解的字串;重寫後可獲得具體清晰的資訊,利於除錯與日誌記錄。

重寫 clone 要小心

專家級程式設計師從不重寫 clone 方法,也不調用它,除非為了低開銷拷貝陣列。為繼承設計的類,若未能實現行為良好的 protected clone 方法,其子類實現 Cloneable 介面是不可能的。

正確實踐:

  1. 所有實現 Cloneable 的類應提供公有 clone 方法,首先調用 super.clone()
  2. 若所有類都這樣做,最終會回溯到 Object.clone(),不會得到錯誤對象
  3. 調用 super.clone() 後,將所有複雜對象設為初始狀態,基本型別資料可直接複製
  4. 通常還需對內部可變對象(如堆疊、鏈表)進行深層結構拷貝,不能簡單複製引用

反例: A 實例有一個堆疊 Stack,若 B.Stack = A.Stack,修改 A 的 stack 會同時影響 B,必須深層拷貝防止此問題。

考慮實現 Comparable 介面

compareTo 是 Comparable 介面唯一方法,Object 中未實現。寫值類時最好實現此介面,帶來極大便利。例如陣列實現此介面後,排序極簡單:Arrays.sort(a)。實現時也要遵循相關規範(自反性、對稱性、傳遞性等)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved