如何制作使用每个字段等于而不是默认等于的 java 接口/抽象 class?

How to make java interface / abstract class that uses per-field equals instead of default equals?

我有一个过程需要创建 java classes,它们将作为 table 中的键(作为 Spark 框架中的键)。为了获得正确的功能,我需要用执行逐字段比较的函数覆盖默认对象 equals() 和哈希码方法。 (我在 Eclipse/Intellij 中自动生成这个)。

问题是每次我创建一个新的 class 或更改现有的 class - 我都需要重新生成 equals/hash。这是一个错误的过程,因为如果我忘记重新生成 equals,就不会出现编译错误。

在 Java 中有什么方法可以创建 class 具有默认字段 equals/hash 代码的 es 吗?

您可以 "generic" 方式实现这样的检查...使用反射。含义:利用反射自动获取对象的所有字段;并比较它们中的每一个。

但是,当然,像那样使用反射可能是扼杀性能的好方法。

因此,更 "serious" 的答案是:考虑您的 "process which requires creating java classes" 的工作原理。也许您可以将 "manual creation of new Java classes" 替换为自动化步骤。意思是:不要自己写Java类。反而;构建了一个生成器,为您创建这些 类(包括 equals 和 hashCode)。

或者,第三个也是不太严重的选项:对这些 类 使用 Scala。创建时 "case classes"; Scala 编译器负责处理 equals、hashCode 等。

此类功能由 Lombok 项目提供。它包括在编译期间执行的注释处理器。它与 Eclipse、maven、ant 等兼容。你应该只用 @EqualsAndHashCode 注释你的 class 它会自动为你创建 equals 和 hashCode。