是否可以在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()
中可用。
请注意,EEnum
和EClass
是EModelElement
的不同子接口,因此除了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没有:)