如果只有一个对象的某些字段代表实际状态,我认为在覆盖equals
和hashCode
时可以忽略这些......
我对此感到不安,并想问,
equals
/ hashCode
中的某些字段时是否有任何文档或指南?在我的特殊情况下,我正在探索一个问题的状态空间。我想保留一组访问状态,但我也在考虑将路径包括在内。显然,两个国家是平等的,即使它们是通过不同的路径找到的。
答案 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开发人员付出代价。