下面的后续内容
假设我有这个简单的模型(Xcore 语法):
class A {
contains B[] bs opposite a
}
class B {
String foo
container A a opposite bs
}
我现在有三个 A,创建如下:
A a1 = ModelFactory.eINSTANCE.createA();
B b1 = ModelFactory.eINSTANCE.createB();
b1.setFoo("foo");
b1.setA(a1);
A a2 = ModelFactory.eINSTANCE.createA();
B b2 = ModelFactory.eINSTANCE.createB();
b2.setFoo("bar");
b2.setA(a2);
A a3 = ModelFactory.eINSTANCE.createA();
B b3 = ModelFactory.eINSTANCE.createB();
b3.setFoo("bar");
b3.setA(a3);
当我尝试像这样比较它们时:
DefaultComparisonScope scope = new DefaultComparisonScope(a1, a2, a3);
Comparison comp = EMFCompare.builder().build().compare(scope);
EList<Diff> diffs = comp.getDifferences();
我期望在 B__FOO
EAttribute 上获得一个属性更改,但我在 A__BS
的 ADD 类型中遇到两个伪冲突。我认为这是因为 EMF 处理平等的方式,而 A 和 B 在技术上是不同的。
如何获得“正确”的差异?
后续 1
我在一个新的工作区中重新创建了这个示例,但我向 A 和 B 类型添加了一个 UUID(就像我的“真实”模型一样),并且这按预期工作。现在来找出为什么我的“真实”模型不...
最佳答案
这里的问题是 EMF Compare 无法正确匹配元素,正如您通过添加 UUID 所意识到的那样。
据我所知,EMF Compare 应该能够匹配您的 B
元素,因为它们内部有一些东西可以区分和匹配,但 A
相反,它本身不包含任何信息。向您的元素添加 UUID 强制其身份,并允许 EMF Compare 知道谁是谁。
您可以通过添加自己的逻辑来匹配您的元素来规避该问题。我认为这不是您的实际模型(和元模型)的样子,因此您可能有办法更好地区分您的元素(或者更好的是,确保您的模型具有标识符)。匹配逻辑可以通过多种方式重新定义。一是change the ID function (负责计算元素 id)如果您的案例包含一种不通过 id 属性来唯一标识元素的方法,或者更改 equality helper这样您就可以准确地告诉 EMF Compare 如何匹配您的 对象(文档中没有相应的示例代码,但您可以在 ID function 代码片段中看到如何更改“相等帮助器工厂”)。
关于java - 当使用 EMF 比较结构相等但根据 == 不同的对象时,如何获得正确的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42954062/