我必须比较两个不同类型的复杂对象(并且在类型层次结构中没有共同的超类),但逻辑上它们可能是等价的。 问题是如何在对象不相等的情况下返回有关比较结果的信息;我想通知调用者为什么对象不等于(哪些字段不同以及它们有何不同)。
到目前为止的选项是:
但我发现它们不是非常优雅/好。
另外,有没有办法将字段比较委托给JUnit中的assertEquals,从而将我的比较基于JUnit,而不需要将比较测试作为实际的单元测试?
答案 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)
您可以返回差异对象列表或字符串列表,其中每个项目代表一个差异。