如何检测 equals() 和 hashCode() 是否与 class 的字段不同步?
How to detect if equals() and hashCode() have gotten out of sync with a class's fields?
我有一个代码库,在几乎所有情况下,实现 equals
和 hashCode
的 class 应该包括 class 包含的每个字段的比较和散列。例如,IDE 将自动生成的默认 equals
和 hashCode
方法是合适的。创建这些方法很容易,但随着时间的推移维护它们却很困难。是否有自动化工具可以分析代码库并生成 class 列表,其中 equals
和 hashCode
方法与其字段不同步?
在最好的情况下,它会具有以下每个功能,但是只做 #1 的工具就已经很有用了:
- 列出具有
equals
和 hashCode
实现的 classes
,它们使用彼此不同的字段集或与 class 上定义的字段不同的字段集。
- 允许指定 class 上的某些字段被有意排除在
equals
/hashCode
之外,因此应该 而不是 出现在 equals
/hashCode
.
还列出 class 字段与 equals
/hashCode
由于继承原因不匹配的字段。这些是定义字段的 classes,并且
覆盖 superclass
中的 equals 和 hashCode 但未能在覆盖中包含 super.equals
/super.hashCode
,
覆盖equals
/hashCode
并调用super,但是superclass
定义字段并且不覆盖它自己的equals
和hashCode
,或
从 superclass
继承自定义 equals
和 hashCode
而不覆盖它。
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 {
...
}
我有一个代码库,在几乎所有情况下,实现 equals
和 hashCode
的 class 应该包括 class 包含的每个字段的比较和散列。例如,IDE 将自动生成的默认 equals
和 hashCode
方法是合适的。创建这些方法很容易,但随着时间的推移维护它们却很困难。是否有自动化工具可以分析代码库并生成 class 列表,其中 equals
和 hashCode
方法与其字段不同步?
在最好的情况下,它会具有以下每个功能,但是只做 #1 的工具就已经很有用了:
- 列出具有
equals
和hashCode
实现的classes
,它们使用彼此不同的字段集或与 class 上定义的字段不同的字段集。 - 允许指定 class 上的某些字段被有意排除在
equals
/hashCode
之外,因此应该 而不是 出现在equals
/hashCode
. 还列出 class 字段与
equals
/hashCode
由于继承原因不匹配的字段。这些是定义字段的 classes,并且覆盖
superclass
中的 equals 和 hashCode 但未能在覆盖中包含super.equals
/super.hashCode
,覆盖
equals
/hashCode
并调用super,但是superclass
定义字段并且不覆盖它自己的equals
和hashCode
,或从
superclass
继承自定义equals
和hashCode
而不覆盖它。
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 {
...
}