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



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

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

或者,是否有一种方法可以使implements(并且只有它)不被EMF的代码生成覆盖?

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

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

有点相关:EMF Eclipse:带有自定义字段(属性)的枚举

一个Enum由一个EEnum实例表示。接口由EClass实例表示,Interface的值设置为true

到ecclass的接口在getEAllSuperTypes()中可用。

请注意,EEnumEClassEModelElement的不同子接口,因此除了EModelElement中公开的成员外,不共享任何成员。
这是因为java对枚举的处理是特殊的,将它们实现为特殊的类。EMF的目的是允许对枚举有更"通用"的理解,因为它们不能公开接口。

因此,在EMF中不可能让枚举实现接口。
在向Enum添加接口时,您唯一的选择是手动完成,避开所有代码生成,因为EMF不支持这种特定的行为。您可能想要考虑的另一种选择是使用一个或多个静态实用程序方法,通过"套用"转换this的方式提供该接口:

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没有:)

相关内容

  • 没有找到相关文章

最新更新