我必须比较两个不同类型的复杂对象(并且在类型层次结构中没有公共超类),但在逻辑上它们可能是等价的。问题在于如何在对象不相等的情况下返回有关比较结果的信息;我想告诉调用者为什么对象不相等(哪些字段不同以及它们有何不同)。
迄今为止的选择是:
- 返回一个字符串
- 抛出异常
但我觉得它们不是很优雅/很好。
此外,有没有办法将字段比较委托给 JUnit 中的 assertEquals ,从而使我的比较基于 JUnit 而没有比较测试是实际的单元测试?
我必须比较两个不同类型的复杂对象(并且在类型层次结构中没有公共超类),但在逻辑上它们可能是等价的。问题在于如何在对象不相等的情况下返回有关比较结果的信息;我想告诉调用者为什么对象不相等(哪些字段不同以及它们有何不同)。
迄今为止的选择是:
但我觉得它们不是很优雅/很好。
此外,有没有办法将字段比较委托给 JUnit 中的 assertEquals ,从而使我的比较基于 JUnit 而没有比较测试是实际的单元测试?
如果比较很复杂,则比较的结果(正如您提到的)可能很复杂。
因此,我建议您考虑第三种选择:创建一个自定义类,ComparisonResult
它封装了结果信息。
您甚至可以创建一点层次结构,并依靠多态性来简化代码。这是一个例子:
ComparisonResult
|
+--- Equals
|
+--- Not equals
|
+--- Compatible (with "isAbeforeB()")
|
+--- Incompatible (with "getReason()")
可能是最Incompatible
混乱的类,我建议您通过一系列对象不兼容的原因来实现它。一个原因本身可能是一个抽象类,具有诸如MissingField
etc之类的子类。
小心!如果您的比较实现与 equals 不匹配,则在不同的容器实现中使用该对象时可能会遇到麻烦。
也就是说,比较接口只能返回 int,所以你必须想出一个不妨碍 Comparable 的不同方法。
equals 方法应该只返回一个布尔值(是否相等)。
您不应该混合比较的功能并获得差异。
为了您的目的,实现附加方法是有意义的(a.getDifferences(b) 或静态方法 Comparision.getDifferences(a,b) 如果您没有公共超类(除了对象))
对于 equals 的实现,调用 getDifferences 方法并检查返回的对象是否为空是有意义的。
结果可能是一个字符串或一个单独的对象
您可以返回差异对象列表或字符串列表,其中每个项目代表一个差异。