【发布时间】:2011-12-03 23:30:02
【问题描述】:
Object javadocs 和 Josh Bloch 告诉我们很多关于应该如何实现 hashCode/equals 的内容,好的 IDE 将正确处理各种类型的字段。一些关于here 的讨论。
这个问题是关于下一步的:你如何确保它们保持良好?
特别是,我觉得对于大多数类,equals/hashCode 应该按照 Bloch 的建议(以及 Eclipse 和其他 IDE 的实现)实现,并考虑到该类上所有非派生的业务逻辑字段。在为类添加新字段作为后续工作的一部分时,人们经常忘记将它们添加到 equals/hashCode 实现中。这可能会导致难以发现的错误,即两个对象看起来相等,但实际上不同之处在于最近引入的字段的值。
当成员字段发生变化时,一个团队(甚至是一个团队!)如何帮助确保类上的 equals/hashCode 继续考虑所有相关字段?
我知道 Apache 的 EqualsBuilder 和 HashCodeBuilder 可以使用反射,这显然会考虑到正确的字段,但我想避免使用它们的性能成本。是否有其他方法来标记不包含在 equals/hashCode 中的字段,并且应该是?静态代码分析、IDE 特性、单元测试技术?
【问题讨论】:
-
在你有分析器告诉你之前不要担心反射的性能。你可能在不知不觉中到处使用它。
-
@RyanStewart 好点,应该更清楚。对于某些类来说,这不是问题,但对于某些类来说(通过探查器演示),我想要一种方法来确保 equals/hashCode 正在处理不使用反射的字段以及随之而来的运行时开销。