【发布时间】:2019-08-21 22:30:05
【问题描述】:
我有一个代码库,其中几乎在所有情况下,实现equals 和hashCode 的类都应该包含该类包含的每个字段的比较和哈希。例如,IDE 将自动生成的默认 equals 和 hashCode 方法是合适的。创建这些方法很容易,但随着时间的推移维护它们却很困难。是否有自动化工具可以分析代码库并生成 equals 和 hashCode 方法与其字段不同步的类列表?
在最好的情况下,它将具有以下每个功能,但仅执行 #1 的工具已经很有用:
- 列出具有
equals和hashCode实现的classes,这些实现使用彼此不同的一组字段或来自类上定义的字段。 - 允许指定某个类中的某些字段有意从
equals/hashCode中排除,因此不应出现在equals/hashCode中。 -
还列出由于继承而导致其字段与其
equals/hashCode不匹配的类。这些是定义字段的类,并且覆盖
superclass中的 equals 和 hashCode 但未能在覆盖中包含super.equals/super.hashCode,覆盖
equals/hashCode并调用super,但是superclass定义了字段并且不会覆盖自己的equals和hashCode,或者从
superclass继承自定义equals和hashCode,而不覆盖它。
【问题讨论】:
-
抱歉,询问工具建议是题外话。请参阅help center 和How to Ask。
-
我不确定我是否完全理解这里的基本推理:hashCode 和 equals 不需要依赖于每个对象字段。强制这种情况是您的选择,而不是 Java 代码的内在品质?你为什么要设置这个限制?您如何保证确实使用每个字段的代码都有意义?
-
@m.antkowicz Jim 评论的哪一部分是讨厌的?这是一个非常好的评论,只是将网站规则告知 OP。
-
@Mike'Pomax'Kamermans 在实践中使用所有字段通常是正确的行为,错误的成本可能很高且难以发现。如果开发人员故意遗漏某些字段,他们可以以低成本对其进行注释。我所描述的是一种静态分析,可以避免最有可能发生的事故。我同意仍然可以无意义地使用一个字段,但这是一种更罕见的故障模式。解决 99% 的问题比没有解决方案更有用。
-
还有@JimGarrison 和其他人——很抱歉在错误的论坛上提出这个问题。今后我会牢记这一点。感谢那些仍然回信的人。