我有以下简单的枚举,我想声明并使用一些常量(作为构造函数参数):
public enum MyEnum {
A(FOO), B(BAR);
MyEnum(String foo) {
}
static final String FOO = "foo";
static final String BAR = "bar";
}
但是,编译器给出了以下错误:
Error:(3, 7) java: illegal forward reference
Error:(3, 15) java: illegal forward reference
如果我尝试在像Intellij IDEA这样的IDE中重构原始枚举,它会将构造函数参数提取到内部类的常量中,并且以下代码编译好了:
SNIPPET 1 :
public enum MyEnum {
A(Constants.FOO), B(Constants.BAR);
MyEnum(String foo) {
}
private static class Constants {
public static final String FOO = "foo";
public static final String BAR = "bar";
}
}
我还发现即使没有内部常量类,如果使用完全分类的名称指定常量,代码也会编译好:
SNIPPET 2 :
public enum MyEnum {
A(MyEnum.FOO), B(MyEnum.BAR);
MyEnum(String foo) {
}
static final String FOO = "foo";
static final String BAR = "bar";
}
问题:
有人可以解释为什么代码片段2中的代码编译而原始代码却没有编译?这是一些链接问题吗?
在片段1和2的解决方案之间进行选择时,哪种方法更好(更干净)?对我来说,代码片段1(带有常量的内部类)看起来更干净,但我担心内部类的额外成本:在这种情况下,应用程序+20内部类中将有20个枚举。
谢谢!