当包含无序的EList时,如何比较两个EObject之间的相等性?

8
我还是一个 EMF 新手,也许我的问题并没有太多意义,或者我假设了错误的事情。
我正在开发一个模型驱动的项目,所以我定义了一个 ecore 元模型并生成了相关代码。现在,我正在尝试进行单元测试,并需要能够测试对象之间的相等性,特别是扩展 EObject 的对象之间的相等性。
我尝试使用 EcoreUtil.equals() 进行测试,但它始终返回 false,因为我的对象包含在列表(EList 类)中的引用未按相同顺序排序。然而,我在元模型中明确定义了这些参考不是有序的:我更希望像 Set 而不是 List 那样使用它们。
因此,我最终决定在我的生成的 *Impl 类中实现自己的 equals 方法,即使在 javadoc 中被反对,但是否有另一种更优雅的方法来测试 EMF 对象之间的结构相等性,而不考虑列表顺序?
谢谢!
3个回答

2
您可以实现自己的工具类,使用EObject默认的equals方法编写无序列表的比较代码。
您可以基于EqualityHelper.equals(List list1, List list2)的实现方式,使用列表的“contains”方法而不是像该方法那样按索引进行比较。

0

我在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)]]
}

1
我不了解Xtend,但在我看来,这段代码似乎没有考虑列表中的重复元素。因此,[1][1, 1, 1]将被报告为相等。 - Lii

0

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

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

EMap<SomeClass, EString> someSet;

如果列表可能包含多个元素,则将其映射为一个整数,该整数表示元素的数量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接