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

时间:2011-10-18 18:57:04

标签: java equals hashcode

如果只有一个对象的某些字段代表实际状态,我认为在覆盖equalshashCode时可以忽略这些......

我对此感到不安,并想问,

  1. 这是常见做法吗?
  2. 这种方法是否存在任何潜在的缺陷?
  3. 在忽略equals / hashCode中的某些字段时是否有任何文档或指南?

  4. 在我的特殊情况下,我正在探索一个问题的状态空间。我想保留一组访问状态,但我也在考虑将路径包括在内。显然,两个国家是平等的,即使它们是通过不同的路径找到的。

3 个答案:

答案 0 :(得分:3)

这取决于您如何考虑给定对象的唯一性。如果它有主键(唯一键),那么单独使用该属性就足够了。

如果您认为唯一性是10个不同属性的组合,那么请使用等于的所有10个属性。

然后仅使用您在equals中使用的属性来生成哈希码,因为相同的对象应该生成相同的哈希码。

选择equals和hashcode的属性是你如何定义给定对象的唯一性。

  • 这是常见做法吗?是

  • 这种方法有潜在的缺陷吗?否

  • 在忽略equals / hashCode中的某些字段时是否有任何文档或指南?

      

    “类Object的equals方法实现最具辨别力   对象可能的等价关系;“

这是来自对象类Javadoc。但作为班级的作者,你知道如何定义唯一性。

答案 1 :(得分:2)

最终,“等于”意味着你想要的意思。存在限制“相等”值必须返回相同的哈希码,当然,如果呈现两个相同的地址“等于”必须返回true。但是你可以,例如,有一个“等于”比较两个网页的内容(忽略nonce的重复性问题),并且,即使URL不同,如果页面内容匹配某些,则表示“相等”方式。

答案 2 :(得分:0)

我在Object上覆盖方法的最佳文档/指南是在Josh Bloch的Effective Java中。它有一整章关于“所有对象共有的方法”,其中包括有关“当覆盖等于时遵守一般契约”和“当覆盖等于时总是覆盖hashCode”的部分。它详细描述了在重写这两种方法时应该考虑的事项。我不会直接泄露答案;这本书绝对值得每个Java开发人员付出代价。