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

时间:2014-03-18 12:46:03

标签: java enums emf

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

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

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

我知道我可以将类javadoc注释中的@generated标记修改为@generatedNOT,这样代码生成器就知道它会覆盖该类,但它会阻止类更新时我修改了模型。

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

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

1 个答案:

答案 0 :(得分:1)

枚举由EEnum的实例表示。接口由EClass的实例表示,该实例的值Interface设置为true

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

请注意,EEnumEClassEModelElement的不同子接口,因此不共享除EModelElement中公开的成员之外的任何成员。
这是因为java在处理Enums方面很特殊,将它们实现为特殊类。 EMF旨在让Enums无法公开接口的地方更加“常见”。

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

interface Foo {
    void bar();
    Baz baz(Quux quux);
}
enum Gen implements Foo { ... }

进入:

class GenFoo {
    static void bar(Foo foo);
    static Baz baz(Foo foo, Quux quux);
}

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