EMF Ecore 模型中的枚举是否可以实现接口?

Aut*_*tar 5 java enums emf

是否可以在 EMF Ecore 模型中进行枚举实现接口?在 Java 中可能有类似 : 的东西public enum MyEnum implements MyInterface。我希望能够通过 EMF 生成这样的东西(顺便说一句,似乎默认情况下所有由 EMF 生成的枚举实现org.eclipse.emf.common.util.Enumerator)。

我找不到让我生成的枚举实现特定接口的方法。我无法在 ecore 图编辑器中定义与枚举的继承关系,也无法在 ecore 模型编辑器中定义继承关系。我可以implements在生成代码后手动将位添加到枚举中,但是每次我再次生成代码时它都会被覆盖。

或者,有没有办法让implements(并且只有它)不被 EMF 的代码生成覆盖?

我知道我可以修改@generated类 javadoc 注释中的标记,@generatedNOT以便代码生成器知道它不能覆盖类,但是当我修改模型时它会阻止类被更新。

现在我所做的是implements每次修改模型中的枚举时手动添加,并@generatedNOT在其余时间保留标签。我觉得这会在几个月后变得危险,当我忘记它时,或者更糟的是,当其他人试图修改它时,即使有适当的记录。

有点相关:EMF Eclipse: enumeration with custom fields (properties)

Vog*_*612 0

枚举由 的实例表示EEnumEClass接口由其值Interface设置为的实例表示true

然后可以在 处获得 EClass 的接口getEAllSuperTypes()

请注意,EEnumEClass是 的不同子接口EModelElement,因此除了 中公开的成员之外,不共享任何成员EModelElement
这是因为 java 对 Enum 的处理很特殊,将它们实现为特殊的类。EMF 旨在允许对无法公开接口的枚举有更“普遍”的理解。

因此,在 EMF 中不可能让 Enum 实现接口。
将接口添加到 Enum 时唯一的选择是手动执行此操作,避开所有代码生成,因为 EMF 不支持该特定行为。您可能需要考虑的另一种选择是使用一个或多个静态实用方法,通过“柯里化”转换来提供该接口:

interface Foo {
    void bar();
    Baz baz(Quux quux);
}
enum Gen implements Foo { ... }
Run Code Online (Sandbox Code Playgroud)

进入:

class GenFoo {
    static void bar(Foo foo);
    static Baz baz(Foo foo, Quux quux);
}
Run Code Online (Sandbox Code Playgroud)

这个想法基本上是 C# 作为“扩展方法”实现的,但它们有对此的语言支持,而 Java 没有:)