比较两个复杂对象时如何返回比较差异?

时间:2012-05-09 07:40:03

标签: java comparison

我必须比较两个不同类型的复杂对象(并且在类型层次结构中没有共同的超类),但逻辑上它们可能是等价的。 问题是如何在对象不相等的情况下返回有关比较结果的信息;我想通知调用者为什么对象不等于(哪些字段不同以及它们有何不同)。

到目前为止的选项是:

  • 返回一个字符串
  • 抛出异常

但我发现它们不是非常优雅/好。

另外,有没有办法将字段比较委托给JUnit中的assertEquals,从而将我的比较基于JUnit,而不需要将比较测试作为实际的单元测试?

4 个答案:

答案 0 :(得分:4)

如果比较复杂,比较的结果(正如您所提到的那样)可能很复杂。

因此,我建议您考虑第三种选择:创建一个封装结果信息的自定义类ComparisonResult

您甚至可以创建一个小的层次结构,并依靠多态来简化代码。这是一个例子:

ComparisonResult
|
+--- Equals
|
+--- Not equals
     |
     +--- Compatible (with "isAbeforeB()")
     |
     +--- Incompatible (with "getReason()")

Incompatible可能是最混乱的类,我建议你通过一系列对象不兼容的原因来实现。原因本身可能是一个抽象类,其子类如MissingField等。

答案 1 :(得分:0)

小心!如果您的比较实现与equals不匹配,则在不同的容器实现中使用该对象时可能会遇到麻烦。

也就是说,比较界面只能返回int,所以你必须想出一个不同的方法来做 not impement Comparable。

答案 2 :(得分:0)

equals方法应该只返回一个布尔值(等于或不等)。

你不应该混淆比较的功能并获得差异。

为了您的目的,如果您没有共同的超类(除了对象),实现一个额外的方法(a.getDifferences(b)或静态方法Comparision.getDifferences(a,b))是有意义的。)

对于equals的实现,调用getDifferences方法并检查返回的对象是否为空是有意义的。

结果可以是字符串或单独的对象

答案 3 :(得分:0)

您可以返回差异对象列表或字符串列表,其中每个项目代表一个差异。