首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在比较两个复杂对象时返回比较差异?

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

Stack Overflow用户
提问于 2012-05-09 07:40:02
回答 4查看 860关注 0票数 1

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

到目前为止的备选办法是:

  • 返回字符串
  • 抛出异常

但我觉得它们不太雅致/好。

另外,是否有一种方法可以将字段比较委托给来自assertEquals的JUnit,从而将我的比较建立在没有比较测试的JUnit基础上,从而成为一个实际的单元测试?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-09 07:42:31

如果比较比较复杂,则比较的结果是(正如您提到的)潜在的复杂。

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

您甚至可以创建一个小层次结构,并依赖于多态性来简化代码。下面是一个例子:

代码语言:javascript
复制
ComparisonResult
|
+--- Equals
|
+--- Not equals
     |
     +--- Compatible (with "isAbeforeB()")
     |
     +--- Incompatible (with "getReason()")

Incompatible可能是最混乱的类,我建议您通过列出这些对象不兼容的原因来实现它。原因可能本身就是一个抽象类,其中有一些子类,如MissingField等。

票数 4
EN

Stack Overflow用户

发布于 2012-05-09 07:44:00

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

也就是说,比较接口只能返回int,所以您必须想出一种不影响可比性的不同方法。

票数 0
EN

Stack Overflow用户

发布于 2012-05-09 07:44:43

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

您不应该将比较和获取差异的功能混为一谈。

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10511767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档