java - 当使用 EMF 比较结构相等但根据 == 不同的对象时,如何获得正确的差异?

标签 java emf emf-compare

下面的后续内容

假设我有这个简单的模型(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/

相关文章:

java - Joptionpane弹出窗口

java - 在Android应用程序中导入csv

java - 卡在平均字长上

java - eclipse EMF : Customize XML deserialization so old project can be loaded into modified model

java - 如果我使用 String str = new String("test); 10 次,它会创建一个对象 10 次吗?

java - 在 Eclipse 上设置 EMF Compare 并编译

java - Eclipse RCP : How to manage user access permissions to resources?

graphviz - 比较图形树

java - EMF Compare 代码的编译问题