此问题特别与覆盖具有大量字段的对象的equals()方法有关.首先,让我说这个大型对象不能在不违反OO原则的情况下分解为多个组件,因此告诉我"没有类应该有超过x个字段"将无济于事.
继续前进,当我忘记检查其中一个字段是否相等时,问题就开始了.因此,我的equals方法不正确.然后我想用反射:
--code removed because it was too distracting--
这篇文章的目的不一定是重构代码(这甚至不是我正在使用的代码),而是得到关于这是否是一个好主意的输入.
优点:
如果添加了新字段,则会自动包含该字段
如果语句,该方法比30多简洁
缺点:
如果添加了新字段,则会自动包含该字段,有时这是不合需要的
性能:这一点要慢一些,我觉得不需要打破一个分析器
将某些字段列入白名单以便在比较中忽略它有点难看
有什么想法吗?
如果您因性能原因确实想要列入白名单,请考虑使用注释来指示要比较的字段.此外,如果您的字段没有良好的实现,则此实现将不起作用equals()
.
PS如果您选择这条路线equals()
,请不要忘记做类似的事情hashCode()
.
PPS我相信你已经考虑过HashCodeBuilder和EqualsBuilder.
使用Eclipse,FFS!
删除hashCode并等于您拥有的方法.
右键单击该文件.
选择Source-> Generate hashcode并等于...
完成!不再担心反思.
对每个添加的字段重复,只需使用大纲视图删除两个方法,然后让Eclipse自动生成它们.
如果你采用反思方法,EqualsBuilder仍然是你的朋友:
public boolean equals(Object obj) { return EqualsBuilder.reflectionEquals(this, obj); }