【发布时间】:2012-03-26 19:43:14
【问题描述】:
我正在尝试通过将结果对象与原始对象进行比较来验证序列化和反序列化例程。这些例程可以序列化任意和深度嵌套的类,因此我想要一个比较例程,它可以给定原始实例和最终实例,并反思性地遍历每个值类型并比较值并迭代地深入参考类型以比较值。
我已经尝试过 Apache Commons Lang EqualsBuilder.reflectionEquals(inst1, inst2) 但这似乎并没有进行非常深入的比较,它只是比较引用类型的相等性,而不是深入研究它们:
以下代码说明了我的问题。第一次调用reflectionEquals 返回真,但第二次返回假。
有没有人可以推荐的库例程?
class dummy {
dummy2 nestedClass;
}
class dummy2 {
int intVal;
}
@Test
public void testRefEqu() {
dummy inst1 = new dummy();
inst1.nestedClass = new dummy2();
inst1.nestedClass.intVal = 2;
dummy inst2 = new dummy();
inst2.nestedClass = new dummy2();
inst2.nestedClass.intVal = 2;
boolean isEqual = EqualsBuilder.reflectionEquals(inst1.nestedClass, inst2.nestedClass);
isEqual = EqualsBuilder.reflectionEquals(inst1, inst2);
}
【问题讨论】:
-
如果反射等于只是比较引用,那么它有一个错误。它应该做得更多。
-
@DwB 我怀疑代码的目的是允许您在特定类中反射性地实现 equals()。这与我想要反映两个对象实例的不同。在这种情况下,这不是错误,而是令人失望!
-
我失去了半天的时间,因为 EqualsBuilder 这种无证的弱行为。如果传递的对象的字段是非原始的,则构建器只需调用 object.equals()。非常令人失望和无用。
-
@AlexWien 这远非没用。事实上,如果使用不当,完全递归的相等方法可能会非常危险!但是,我同意文档应该更清晰。我提出了issues.apache.org/jira/browse/LANG-1034 来解决缺失的功能。我将提出另一个错误来解决误导性文档。
-
@AlexWien 我从未见过任何名为
equals的方法进行深度比较。深度比较似乎是几乎不需要的例外,因此您不应该对标准行为感到失望。
标签: java serialization reflection comparison equals