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

aio*_*obe 6 java equals hashcode

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

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

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

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

jav*_*use 3

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

如果您认为唯一性是 10 个不同属性的组合,则在 equals 中使用所有 10 个属性。

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

选择 equals 和 hashcode 的属性是定义给定对象的唯一性的方式。

  • 这是常见做法吗?是的

  • 这种方法有任何潜在的陷阱吗?不

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

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

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