如何检测 equals() 和 hashCode() 是否与 class 的字段不同步?

How to detect if equals() and hashCode() have gotten out of sync with a class's fields?

我有一个代码库,在几乎所有情况下,实现 equalshashCode 的 class 应该包括 class 包含的每个字段的比较和散列。例如,IDE 将自动生成的默认 equalshashCode 方法是合适的。创建这些方法很容易,但随着时间的推移维护它们却很困难。是否有自动化工具可以分析代码库并生成 class 列表,其中 equalshashCode 方法与其字段不同步?

在最好的情况下,它会具有以下每个功能,但是只做 #1 的工具就已经很有用了:

  1. 列出具有 equalshashCode 实现的 classes,它们使用彼此不同的字段集或与 class 上定义的字段不同的字段集。
  2. 允许指定 class 上的某些字段被有意排除在 equals/hashCode 之外,因此应该 而不是 出现在 equals/hashCode.
  3. 还列出 class 字段与 equals/hashCode 由于继承原因不匹配的字段。这些是定义字段的 classes,并且

    • 覆盖 superclass 中的 equals 和 hashCode 但未能在覆盖中包含 super.equals/super.hashCode

    • 覆盖equals/hashCode并调用super,但是superclass定义字段并且不覆盖它自己的equalshashCode,或

    • superclass 继承自定义 equalshashCode 而不覆盖它。

Is there an automated tool that can analyze a codebase and produce a list of classes whose equals and hashCode methods are not in sync with their fields

您可以将 Lombok - java library that is automatically genereting boiler plate code for your java classes. You are adding this as dependency, putting special annotation 用于您的 class 仅此而已 - 每次更改都会为您重新生成正确的方法

@EqualsAndHashCode
public class MyComplicatedClass {
    ...
}