Java:我可以使用常量字符串作为枚举键值吗?

时间:2017-08-15 14:25:22

标签: java enums

我有一个带有几个键的枚举类。 许多键应具有相同的字符串值。 Sonar对我大吼大叫,用一个常数值替换相同的字符串值。

例如:

public enum MESSAGE_TYPES {

KEY1("Val1"),
KEY2("Val2"),
KEY3("Val3"),
KEY4("Val2"),
KEY5("Val4"),
KEY6("Val2"),
//etc.

}

所以,声纳要我:

  

定义一个常量而不是复制这个文字......

表示“Val2”,因为它定义了3次或更多次。 我怎样才能做到这一点?

自动将值提取为常量会将其置于枚举键之后,但是当然,枚举键的值无法识别它。 所以,我试图把它放在枚举类

之上
public enum MESSAGE_TYPES {

    private static final String VAL2 = "Val2";

    KEY1("Val1"),
    KEY2(VAL2),
...
}

因此我在行上收到“语法错误”错误。

请告知。

谢谢!

1 个答案:

答案 0 :(得分:4)

在声明枚举值之前,您无法在枚举类中声明static个字段 在枚举值之后声明static字段将不允许在枚举构造函数中使用它们 因此,只需在类中提取String值,并在枚举值声明中引用它们。

例如:

public final class MyMessageConstant{

    public static final String VAL1 = "Val2";
    public static final String VAL2 = "Val2";

    private MyMessageConstant(){
    }
}

和枚举:

public enum MESSAGE_TYPES {

    KEY1(MyMessageConstant.VAL1),
    KEY2(MyMessageConstant.VAL2),
...
}

如果将String值保持为enum类的私有值,则可以将常量类声明为枚举的private static final类成员:

public enum Types {

    KEY1(MyMessageConstant.VAL1), KEY2(MyMessageConstant.VAL2),...
    KEY4(MyMessageConstant.VAL2),

    private static final class MyMessageConstant {        
       private static final String VAL1 = "Val2";
       private static final String VAL2 = "Val2";        
       private MyMessageConstant() {}
    }

    private String value;

    private Types(String value) {
      this.value = value;
    }

}