这个问题特别与为具有大量字段的对象覆盖 equals() 方法有关。首先,让我说这个大对象不能在不违反 OO 原则的情况下分解成多个组件,所以告诉我“没有类应该有超过 x 个字段”无济于事。
继续前进,当我忘记检查其中一个字段是否相等时,问题就出现了。因此,我的 equals 方法是不正确的。然后我想到使用反射:
--code removed because it was too distracting--
这篇文章的目的不一定是重构代码(这甚至不是我正在使用的代码),而是为了了解这是否是个好主意。
优点:
- 如果添加了一个新字段,它会自动包含
- 该方法比 30 个 if 语句简洁得多
缺点:
- 如果添加了一个新字段,它会自动包含,有时这是不受欢迎的
- 性能:这必须更慢,我觉得没有必要打破分析器
- 在比较中将某些要忽略的字段列入白名单有点难看
有什么想法吗?
最佳答案
如果您确实出于性能原因想要列入白名单,请考虑使用注释来指示要比较的字段。此外,如果您的字段没有很好地实现 equals()
,则此实现将不起作用。
附言如果您为 equals()
走这条路,请不要忘记为 hashCode()
做类似的事情。
附言我相信你已经考虑过了 HashCodeBuilder和 EqualsBuilder .
关于Java 等于(): to reflect or not to reflect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/124585/