不能引用初始值设定项中的静态枚举字段?
2022-08-31 20:53:50
我刚刚得到了有这个错误的Java5项目,我尝试使用Java5和Java6,但它仍然存在。它以前以某种方式工作(因为它是在svn中),我怎么能绕过编译器错误?
我刚刚得到了有这个错误的Java5项目,我尝试使用Java5和Java6,但它仍然存在。它以前以某种方式工作(因为它是在svn中),我怎么能绕过编译器错误?
不要“绕过”错误 - 它不会做你想要的。错误是有充分理由的。
枚举值在任何其他静态字段之前初始化。如果要执行一些操作,例如将所有值添加到映射中,请在静态初始值设定项中执行其他所有操作:
import java.util.*;
public enum Foo
{
BAR, BAZ;
private static final Map<String, Foo> lowerCaseMap;
static
{
lowerCaseMap = new HashMap<String, Foo>();
for (Foo foo : EnumSet.allOf(Foo.class))
{
// Yes, use some appropriate locale in production code :)
lowerCaseMap.put(foo.name().toLowerCase(), foo);
}
}
}
另一种“绕过”它的方法,例如,如果您需要一个计数器或需要在每次初始化上运行的东西,是创建一个私有的静态内部类,如下所示:
public enum Foo {
BAR, BAZ;
private static final class StaticFields {
private static final Map<String, Foo> lowerCaseMap = new HashMap<>();
private static int COUNTER = 0;
}
private Foo() {
StaticFields.lowerCaseMap.put(this.name().toLowerCase(), this);
StaticFields.COUNTER++;
}
}