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

jil*_*t3d 46 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Mac*_*ski 64

正如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";
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为应该注意的是 @RequiredArgsConstructor 来自 lombok 库。 (3认同)
  • @BrunoLeite 如果您将“Constants”类设置为非“private”,那么这确实可以在注释值中使用常量。 (2认同)

小智 18

public enum MyEnum {
    BAR1(MyEnum.BAR_VALUE);

    public static final String BAR_VALUE = "Bar";
Run Code Online (Sandbox Code Playgroud)

工作正常

  • @Snickbrack 我愿意。它消除了静态嵌套类。好答案。 (8认同)
  • 尝试了这个并给出了相同的错误:编译时非法前向引用 (4认同)
  • 我没有看到这个答案对现有和接受的答案有任何补充。您能否通过提供解释来进一步澄清您的答案? (2认同)

小智 5

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");}
}
Run Code Online (Sandbox Code Playgroud)

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