题
这个问题是具体涉及到压倒一切的等()方法的对象一个大数目的领域。首先,让我说,这大象不能被分解为多个组件在不违反OO原则,所以告诉我"没有类应该有更多的比x领域"不会有帮助。
移动上,该问题来取得成果的时候我忘了检查的一个领域的平等。因此,我等方法是不正确的。然后我想用反思:
--code removed because it was too distracting--
这个帖子的目的不一定是"重构"的代码(这甚至不是代码,我在使用),而是以得到输入上是否这是一个很好的想法。
赞成:
- 如果一个新领域是加,这是自动包括在内
- 该方法是更为简短于30如果声明
缺点:
- 如果一个新领域是加,这是自动包括在内,有时这是不希望
- 性能:这是速度较慢,我不觉得有必要打破了一个分析器
- 白名单的某些领域的忽略在比较是一个小丑
任何想法?
解决方案
如果你有没有想到白名单性能的原因,可以考虑采用一个注释,说明哪些领域比较。此外,这种实施不会工作如果你的领域没有好的实现 equals()
.
P.S.如果你走了这条路线 equals()
, 不要忘记做到的东西似的 hashCode()
.
P.P.S.我相信你已经被认为是 HashCodeBuilder 和 EqualsBuilder.
其他提示
利用日食,农民田间学校!
删除哈希码和平等的方法。
右键文件。
选择来源->产生的哈希码等于...
做!没有更多的担忧有关的思考。
重复每个领域增加了,你只是使用的轮廓图删除两种方法,然后让蚀自动生成。
如果你去的反射方法,EqualsBuilder仍然是你的朋友:
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}
这里有一个想如果你在担心:
1/忘记更新你的大系列的如果陈述的用于检查的平等当添加或删除的领域。
2/性能这样做等于()方法。
试试下面的:
a/恢复到使用的长期序列,如果发言你等于()方法。
b/有一个单一的功能,其中包含一个列表中的领域(在一串阵列),并将检查名单对现实(即,反映字段)。它会把一个异常,如果他们不相匹配。
c/在你的构造为此目的,必须同步运行的一次呼吁以这个函数(类似于一个单独的图案)。换句话说,如果这是第一个目的构成通过这类电话的检查功能的上述(b)所述。
除将使它立即显而易见的当运行程序,如果你还没有更新过,如果报表相匹配的反射领域;然后你修复的如果陈述和更新的领域列表(b)所述。
随后修建的对象不会做这种检查和你等于()方法将运行在它的最大可能的速度。
试试我可能,我没能找到任何真正的问题,这种做法(大心中可能存在计算器)-还有一个额外的条件检查在每个对象结构的运行一次性的行为,但是似乎相当小。
如果你足够努力,你仍然可以得到你的如果陈述的步骤与你的领域列表和反映的领域,但除会确保你领域列表相匹配的反映域和你只要确保更新如果报表和领域清单,在同一时间。
你可以随时注的领域的你做/不想在你等方法,这应该是一个简单和简单的改变。
性能是显然关系到如何经常的对象实际上是比较,但大量的框架使用的散列的地图,所以你等于可能正在使用超过你的想法。
此外,发言的散列地图,你有同样的问题,与哈希码的方法。
最后,你真的需要比较的所有领域的平等?
你有几个臭虫在你的代码。
- 你不能假定
this
和obj
是同一类。事实上,它明确允许为obj
任何其他类。你可以开始if ( ! obj instanceof myClass ) return false;
但是这是 仍然不是正确的 因obj
可能是一个子类的this
与其他领域可能的事。 - 你必须支持
null
值obj
一个简单的if ( obj == null ) return false;
- 你不能这样对待
null
和empty string作为平等的。而不是治疗null
特别。最简单的方法来这里是开始通过比较Field.get(obj) == Field.get(this)
.如果他们都是平等或两者发生点相同的对象,这是快速。(注:这也是一个优化的,因为这是一个缓慢的程序。) 如果失败,可以使用快if ( Field.get(obj) == null || Field.get(this) == null ) return false;
到处理的情况下,一个是null
.最后你可以使用通常的equals()
. - 你不用
foundMismatch
我同意,汉克 [HashCodeBuilder][1]
和 [EqualsBuilder][2]
是一个更好的路要走。这很容易维持,没有大量的代码,并避免所有这些问题。
你可以用注释来排除的领域,从检查
例如
@IgnoreEquals
String fieldThatShouldNotBeCompared;
然后当然你检查存在的注释在一般平等的方法。
如果你有访问的姓名等领域,为什么你不让它的一个标准领域的你不想包括总是以"当地"或"nochk"或者类似的东西。
然后你的黑名单的所有领域,开始与此(代码不是那么丑陋然后).
我不怀疑它慢一点。你需要决定是否你想要交换易于更新反对执行速度。
看看org.apache.共用。EqualsBuilder: