如何在Xcore中定义地图

Gab*_*yas 6 eclipse-emf emf xcore

根据EMF FAQ,可以在EMF中创建一个Map:

EMap基本上是java.util.Map $ Entry实例的List.因此,要创建Map,您需要首先按照以下步骤为地图条目建模:

  1. 创建一个名为[Type1]的EClass到[Type2] Map,其中[Type1]表示键的类型,[Type2]表示值的类型.
  2. 将新创建的EClass的Instance Class Name属性设置为java.util.Map $ Entry.
  3. 创建名为"key"的EAttribute或EReference,并为其设置EDataType或EClass.
  4. 创建一个名为"value"的EAttribute或EReference,并为其设置EDataType或EClass.

现在,当您使用此映射条目类作为其EClass创建一个EReference时,EMF代码生成器将检测此特殊情况并为您生成正确类型的EMap getter/setter,而不是正常的EList getter/setter.

我可以在Xcore模型中使用它吗?我不确定步骤#2在Xcore中是否可行,或者它是否支持地图.

Mat*_*ias 6

对我来说,这有效。

DataPoints.xcore

...
class KeyValuePair wraps java.util.Map$Entry {
    String key
    String value
}

class KeyValueList {
    contains KeyValuePair[] entries
}
Run Code Online (Sandbox Code Playgroud)

上面的结果导致一个KeyValueListImpl类的getEntries方法如下所示:

public EMap<String, String> getEntries() {
    if (entries == null) {
        entries = new EcoreEMap<String,String>(DataPointsPackage.Literals.KEY_VALUE_PAIR, KeyValuePairImpl.class, this, DataPointsPackage.KEY_VALUE_LIST__ENTRIES);
    }
    return entries;
}
Run Code Online (Sandbox Code Playgroud)