当前位置: 首页 > 知识库问答 >
问题:

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

佟涵畅
2023-03-14
import org.eclipse.emf.common.util.Enumerator;

public enum MyEnum implements Enumerator {
   LITERAL1(0, "Name", "Literal", "custom1", "custom2", "custom3"),
   LITERAL2(0, "Name", "Literal", "custom1", "custom2", "custom3"),
   LITERAL3(0, "Name", "Literal", "custom1", "custom2", "custom3"),
   LITERAL4(0, "Name", "Literal", "custom1", "custom2", "custom3");

   public static final int LITERAL1_VALUE = 0;
   public static final int LITERAL2_VALUE = 1;
   public static final int LITERAL3_VALUE = 2;
   public static final int LITERAL4_VALUE = 3;

   private static final MyEnum[] VALUES_ARRAY =
        new MyEnum[] {
           LITERAL1,
           LITERAL2,
           LITERAL3,
           LITERAL4,
   };

   public static final List<MyEnum> VALUES =
        Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));

   private final int value;
   private final String name;
   private final String literal;
   private final String custom1;
   private final String custom2;
   private final String custom3;
   private MyEnum(int value, String name, String literal, 
                 String custom1, String custom2, String custom3) {
        this.value = value;
        this.name = name;
        this.literal = literal;
        this.custom1 = custom1;
        this.custom2 = custom2;
        this.custom3 = custom3;
   }

    /*Getters for all of them*/

这就是所谓的扩展枚举。我知道它管用--我以前试过并用过很多次。我知道如果这是您应该对枚举做的事情,可能会有讨论--我认为是的,因为您仍然有您定义的常量,但它们只是包含了一些更多的信息(仍然是常量)。(另外:我看过这个例子,java枚举上的自定义字段没有序列化,我认为它们也遵循了我在如何生成枚举上的自定义属性方面的思路)。

现在,我究竟应该如何从Eclipse EMF模型生成这样的东西呢?我甚至不知道在.ecore模型编辑器中向我的枚举添加额外的属性...我尝试将额外的属性作为注释添加到ExtendedMetaData,它包含所有自定义属性的键。但是,当生成一个.genmodel文件时,它不会改变文件(我知道,因为我将它保存在SVN中的一个较早的签入版本中,而SVN告诉我没有任何改变)。当然,这也使得生成的模型代码没有变化。

有人吗?我知道我可以手工更改生成的模型代码,但如果我可能更改模型的某些内容,我会丢失那些编辑,这显然不是我想要的。

更新:更清楚的是,这是我的.ecore在模型编辑器中的样子:

MyEnum (EEnum)
    LITERAL1 (EEnum Literal)
        ExtendedMetaData (EAnnotation)
            custom1 -> custom1
            custom2 -> custom2
            custom3 -> custom3
    LITERAL2 (EEnum Literal)
        ExtendedMetaData (EAnnotation)
            custom1 -> custom1
            custom2 -> custom2
            custom3 -> custom3
    LITERAL3 (EEnum Literal)
        ExtendedMetaData (EAnnotation)
            custom1 -> custom1
            custom2 -> custom2
            custom3 -> custom3
    LITERAL4 (EEnum Literal)
        ExtendedMetaData (EAnnotation)
            custom1 -> custom1
            custom2 -> custom2
            custom3 -> custom3

共有1个答案

司寇山
2023-03-14

有人吗?我知道我可以手工更改生成的模型代码,但如果我可能更改模型的某些内容,我会丢失那些编辑,这显然不是我想要的。

实际上,您可以按照通常的方式添加扩展枚举。当genmodel从模型生成代码时,它会添加一个标记@generate,以知道它创建了哪些代码。如果添加一段代码,它就不会有这个标志。然后,如果需要更新模型和生成的代码,EMF只需修改具有@generated标记的代码片段。这样,它将尊重您的代码插入,并且您不会丢失您已经完成的内容。

有关更多信息,您可以在Budinsky和公司编写的Eclipse建模框架书上进行搜索。我引用书中所说的话(第25页):

 类似资料:
  • 问题内容: 我继承了一些代码,这些代码最终将成为API调用的一部分。基于现有代码,该调用是使用access_token检索JSON代码的帖子。尽管这通常很简单,并且像其他所有API一样,但是此代码要求为客户机密提供一个自定义的httpheader字段。 我能够使用URLRequest等在Objective C中完成此工作,但是由于我正在创建对Web组件的调用,因此遇到了很多困难。 我正在使用一个非

  • 我有一个简单的问题,但我在文档中找不到任何关于它的东西,也找不到任何示例。 我有一个使用RabbitMQ和spring boot AMQP模块的spring boot项目。我正在使用一个特定的交换和spring,所以我想我需要定义我自己的bean(在这一点上,如果有人知道是否可以用另一种更简单的方法来完成,欢迎您)。 这里对我来说真正的问题是,我还必须定义一个bean,只是为了将其设置为模板,但似

  • 试图向OpenLDAP添加一个新属性,但总是碰壁。我正在尝试向架构添加ipPhone属性,因为我不能在默认的telephoneNumber属性中包含*数字。 下面是我的LDIF文件,用于创建新属性并将其与objectClass类似。 我已经测试和谷歌了几个小时,但一直无法解决这个问题或找出我错过了什么!

  • 问题内容: 我正在从DropWizard 0.7.1迁移到0.8.1的过程中。这包括从Jersey 1.x迁移到2.x。在使用Jersey 1.18.1的实现中,我实现了(为简单起见,更改了所有类名)。此类将创建包含自定义注入批注的对象。包含传递并由读取的各种属性。最后,在该类中,我注册的新实例,如下所示。 我已经进行了一些研究,似乎无法完全围绕如何在Jersey 2.x中创建(或替换)这样的se

  • 我在我的SpringBoot应用程序中使用SpringCloud配置,我需要编写一些自定义代码来处理属性,当属性被标记为这样时,这些属性将从我的公司密码库中读取。我知道SpringCloud支持Hashicorp Vault,但在这种情况下不是这样的。 我不想硬编码从不同的源检索特定的属性,例如,我会为应用程序创建一个属性文件,其中profile的值为: 但对于其他一些配置文件,如,我会: 因此,