【问题标题】:Is it possible to have an enumeration in a EMF Ecore model implement an interface?是否可以让 EMF Ecore 模型中的枚举实现接口?
【发布时间】:2014-04-24 03:53:53
【问题描述】:

是否可以让 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)

【问题讨论】:

    标签: java enums emf


    【解决方案1】:

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

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

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

    因此,在 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 没有:)

    【讨论】:

      猜你喜欢
      • 2016-09-05
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 2014-07-11
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      • 1970-01-01
      相关资源
      最近更新 更多