【问题标题】:How to detect if equals() and hashCode() have gotten out of sync with a class's fields? [closed]如何检测 equals() 和 hashCode() 是否与类的字段不同步? [关闭]
【发布时间】:2019-08-21 22:30:05
【问题描述】:

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

在最好的情况下,它将具有以下每个功能,但仅执行 #1 的工具已经很有用:

  1. 列出具有equalshashCode 实现的classes,这些实现使用彼此不同的一组字段或来自类上定义的字段。
  2. 允许指定某个类中的某些字段有意从equals/hashCode 中排除,因此不应出现在equals/hashCode 中。
  3. 还列出由于继承而导致其字段与其equals/hashCode 不匹配的类。这些是定义字段的类,并且

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

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

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

【问题讨论】:

  • 抱歉,询问工具建议是题外话。请参阅help centerHow to Ask
  • 我不确定我是否完全理解这里的基本推理:hashCode 和 equals 不需要依赖于每个对象字段。强制这种情况是您的选择,而不是 Java 代码的内在品质?你为什么要设置这个限制?您如何保证确实使用每个字段的代码都有意义?
  • @m.antkowicz Jim 评论的哪一部分是讨厌的?这是一个非常好的评论,只是将网站规则告知 OP。
  • @Mike'Pomax'Kamermans 在实践中使用所有字段通常是正确的行为,错误的成本可能很高且难以发现。如果开发人员故意遗漏某些字段,他们可以以低成本对其进行注释。我所描述的是一种静态分析,可以避免最有可能发生的事故。我同意仍然可以无意义地使用一个字段,但这是一种更罕见的故障模式。解决 99% 的问题比没有解决方案更有用。
  • 还有@JimGarrison 和其他人——很抱歉在错误的论坛上提出这个问题。今后我会牢记这一点。感谢那些仍然回信的人。

标签: java equals hashcode


【解决方案1】:

是否有自动化工具可以分析代码库并生成其 equals 和 hashCode 方法与其字段不同步的类列表

您可以使用Lombok - 自动为您的 java 类生成样板代码的 java 库。您将其添加为依赖项,将 special annotation 添加到您的类中,仅此而已 - 每次更改都会为您重新生成正确的方法

@EqualsAndHashCode
public class MyComplicatedClass {
    ...
}

【讨论】:

  • 这看起来很有用。来自 Lombok 的文档:任何类定义都可以使用 EqualsAndHashCode 进行注释,以让 lombok 生成 equals(Object other) 和 hashCode() 方法的实现。默认情况下,它将使用所有非静态、非瞬态字段,但您可以通过使用 EqualsAndHashCode.Include 或 EqualsAndHashCode 标记类型成员来修改使用哪些字段(甚至指定要使用各种方法的输出) 。排除。或者,您可以通过使用 EqualsAndHashCode.Include... 标记来准确指定您希望使用的字段或方法。
猜你喜欢
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
  • 2011-11-12
  • 2017-02-05
  • 2023-01-11
相关资源
最近更新 更多