1

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

迄今为止的选择是:

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

但我觉得它们不是很优雅/很好。

此外,有没有办法将字段比较委托给 JUnit 中的 assertEquals ,从而使我的比较基于 JUnit 而没有比较测试是实际的单元测试?

4

4 回答 4

4

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

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

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

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

可能是最Incompatible混乱的类,我建议您通过一系列对象不兼容的原因来实现它。一个原因本身可能是一个抽象类,具有诸如MissingFieldetc之类的子类。

于 2012-05-09T07:42:31.647 回答
0

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

也就是说,比较接口只能返回 int,所以你必须想出一个妨碍 Comparable 的不同方法。

于 2012-05-09T07:44:00.230 回答
0

equals 方法应该只返回一个布尔值(是否相等)。

您不应该混合比较的功能并获得差异。

为了您的目的,实现附加方法是有意义的(a.getDifferences(b) 或静态方法 Comparision.getDifferences(a,b) 如果您没有公共超类(除了对象))

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

结果可能是一个字符串或一个单独的对象

于 2012-05-09T07:44:43.050 回答
0

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

于 2012-05-09T07:47:07.837 回答