有没有办法在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;
}
上面的代码我收到以下错误消息:在定义字段之前无法引用该字段。
答案 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;
(你可以把它放到课堂上,不管它是否合理)