簡體   English   中英

忽略equals / hashCode中的某些字段時可能存在的陷阱?

[英]Potential pitfalls when ignoring some fields in equals/hashCode?

如果只有一個對象的某些字段代表實際狀態,我認為在覆蓋equalshashCode時可以忽略這些...

我對此感到不安,並想問,

  1. 這是常見做法嗎?
  2. 這種方法有任何潛在的缺陷嗎?
  3. 在忽略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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM