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

时间:2015-05-04 13:14:03

标签: java hash equals

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

问题是每次我创建一个新类或对现有类进行更改时 - 我需要重新生成equals / hash。这是一个错误的过程,因为如果我忘记重新生成equals,则没有编译错误。

在Java中是否有任何方法可以创建具有默认的字段等于/哈希代码的类?

2 个答案:

答案 0 :(得分:1)

您可以使用反射以“通用”方式实施此类检查。含义:使用反射自动获取对象的所有字段;并比较每一个。

但是,当然,使用这样的反射可能是一种杀死你的表现的好方法。

因此,一个更“严肃”的答案是:考虑你的“需要创建java类的过程”是如何工作的。也许您可以通过自动步骤替换“手动创建新Java类”。含义:不要自己编写Java类。代替;构建了一个为你创建这些类的生成器(包括equals和hashCode)。

或者,第三个也是不那么严肃的选择:对这些类使用Scala。在创建“案例类”时; Scala编译器负责equals,hashCode,...你可以命名它。

答案 1 :(得分:1)

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