[英]Potential pitfalls when ignoring some fields in equals/hashCode?
如果只有一個對象的某些字段代表實際狀態,我認為在覆蓋equals
和hashCode
時可以忽略這些...
我對此感到不安,並想問,
equals
/ hashCode
某些字段時是否有任何文檔或指南? 在我的特殊情況下,我正在探索一個問題的狀態空間。 我想保留一組訪問狀態,但我也在考慮包括通往該州的路徑 。 顯然,兩個國家是平等的,即使它們是通過不同的途徑找到的。
這基於您如何考慮給定對象的唯一性。 如果它有主鍵(唯一鍵),那么單獨使用該屬性就足夠了。
如果您認為唯一性是10個不同屬性的組合,那么使用等於的所有10個屬性。
然后僅使用您在equals中使用的屬性來生成哈希碼,因為相同的對象應該生成相同的哈希碼。
選擇equals和hashcode的屬性是如何定義給定對象的唯一性。
這是常見做法嗎? 是
這種方法有任何潛在的缺陷嗎? 沒有
在忽略equals / hashCode中的某些字段時是否有任何文檔或指南?
“類Object的equals方法實現了對象上最具辨別力的等價關系;”
這是來自對象類Javadoc。 但作為班級的作者,您知道如何定義唯一性。
最終,“等於”意味着你想要的意思。 存在限制“相等”值必須返回相同的哈希碼,當然,如果呈現兩個相同的地址“等於”必須返回true。 但是你可以,例如,有一個“等於”比較兩個網頁的內容(忽略nonce的重復性問題),並且,即使URL不同,如果頁面內容匹配某些,則表示“相等”辦法。
我在覆蓋Object
方法時看到的最佳文檔/指南是在Josh Bloch的Effective Java中 。 它有一整章關於“所有對象共有的方法”,其中包括有關“當覆蓋等於時遵守一般契約”和“當覆蓋等於時總是覆蓋hashCode”的部分。 它詳細描述了在重寫這兩種方法時應該考慮的事項。 我不會直接泄露答案; 這本書絕對值得每個Java開發人員付出代價。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.