如何在Java枚举中定义静态常量?

时间:2014-05-12 12:20:10

标签: java enums constants

有没有办法在Java枚举声明中定义静态最终变量(有效常量)?

我想要的是在一个地方定义BAR(1 ... n)值的字符串文字值:

@RequiredArgsConstructor
public enum MyEnum {
    BAR1(BAR_VALUE),
    FOO("Foo"),
    BAR2(BAR_VALUE),
    ...,
    BARn(BAR_VALUE);

    private static final String BAR_VALUE = "Bar";

    @Getter
    private final String value;
}

上面的代码我收到以下错误消息:在定义字段之前无法引用该字段

4 个答案:

答案 0 :(得分:58)

正如IntelliJ IDEA建议在提取常量时 - 制作静态内部类。这种方法有效:

@RequiredArgsConstructor
public enum MyEnum {
    BAR1(Constants.BAR_VALUE),
    FOO("Foo"),
    BAR2(Constants.BAR_VALUE),
    ...,
    BARn(Constants.BAR_VALUE);



    @Getter
    private final String value;

    private static class Constants {
        public static final String BAR_VALUE = "BAR";
    }
}

答案 1 :(得分:3)

public enum MyEnum {
    BAR1(MyEnum.BAR_VALUE);

    public static final BAR_VALUE = "Bar";

工作正常

答案 2 :(得分:0)

public enum MyEnum {
//  BAR1(       foo),   // error: illegal forward reference
//  BAR2(MyEnum.foo2),  // error: illegal forward reference
    BAR3(MyEnum.foo);   // no error

  public static final int foo =0;
  public static       int foo2=0;
  MyEnum(int i) {}

  public static void main(String[] args) { System.out.println("ok");}
}

这可以在没有内部类常量的情况下完成。

答案 3 :(得分:-2)

也许你应该考虑将这个枚举分为两个字段:enum和int:

@RequiredArgsConstructor
public enum MyEnum {
    BAR("Bar"),
    FOO("Foo")

    @Getter
    private final String value;
}

然后使用:

private MyEnum type;
private int value;

(你可以把它放到课堂上,不管它是否合理)