如何在对象包含无序List时比较对象之间的相等性?

时间:2012-08-30 15:08:36

标签: java list equals emf

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

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

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

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

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以使用EObject默认equals方法实现自己的实用程序类,其中您可以使用EObject默认的equals方法对无序列表进行自己的比较。

您可以将您的实施基于 EqualityHelper.equals(List list1, List list2)使用列表“包含”而不是像该方法那样按索引进行。

答案 1 :(得分: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)]]
}

答案 2 :(得分:0)

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

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

EMap<SomeClass, EString> someSet;

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