是否可以在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)
答案 0 :(得分:1)
枚举由EEnum
的实例表示。接口由EClass
的实例表示,该实例的值Interface
设置为true
。
然后可以在getEAllSuperTypes()
上获得EClass的接口。
请注意,EEnum
和EClass
是EModelElement
的不同子接口,因此不共享除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没有:)