【问题标题】:How to compare equality between EObject when they contained unordered EList?当 EObject 包含无序 EList 时,如何比较它们之间的相等性?
【发布时间】:2012-08-25 08:48:25
【问题描述】:

我仍然是 EMF 的新手,所以也许我的问题没有真正的意义,或者我假设错了。

我正在处理一个模型驱动的项目,因此我定义了一个 ecore 元模型并生成了关联代码。现在我正在尝试进行单元测试,我需要能够测试对象之间的相等性,尤其是扩展 EObject 的对象之间的相等性。

我尝试使用 EcoreUtil.equals() 进行测试,但它总是返回 false,因为我的对象包含列表(EList 类)中的引用,这些引用的排序方式不同。但是,我在我的元模型中明确定义了引用没有排序:我想使用它们更像 Set 而不是 List。

所以,我最终决定在我生成的 *Impl 类中实现我自己的 equals 方法,即使它在 javadoc 中不鼓励,但它还有另一种更优雅的方式来测试 EMF 对象之间的结构相等性而不考虑列表的顺序?

谢谢!

【问题讨论】:

    标签: java list equals emf


    【解决方案1】:

    您可以实现自己的实用程序类,使用 EObject 默认的 equals 方法编写自己的无序列表比较代码。

    您可以在 EqualityHelper.equals(List list1, List list2) 使用列表“包含”而不是像该方法那样按索引。

    【讨论】:

      【解决方案2】:

      我在 Xtend 中编写了以下实用方法:

      static def boolean equalsTo(Set<? extends EObject> eObjectSet1, Set<? extends EObject> eObjectSet2) {
          contains(eObjectSet1, eObjectSet2) && contains(eObjectSet2, eObjectSet1)
      }
      
      static def boolean contains(Set<? extends EObject> eObjectSet1, Set<? extends EObject> eObjectSet2) {
          eObjectSet1.forall[eObject1 | eObjectSet2.exists[eObject2 | EcoreUtil.equals(eObject1, eObject2)]]
      }
      

      【讨论】:

      • 我不知道 Xtend,但在我看来,这段代码似乎没有考虑到列表中的重复元素。所以[1][1, 1, 1] 将被报告为相等。
      【解决方案3】:

      这可能可以通过使用EMap 来解决,将前一个列表的元素作为键,并将任意其他类型(例如EString)作为值。

      如果一个元素应该在集合中,则将其映射到空字符串。

      EMap<SomeClass, EString> someSet;
      

      如果列表可以包含多个元素,请将其映射到给出元素数量的整数。

      【讨论】:

        猜你喜欢
        • 2013-08-29
        • 2020-08-20
        • 2014-08-28
        • 1970-01-01
        • 2010-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多