不能引用初始化程序中的静态枚举字段?
我刚刚得到了这个错误的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); } } }
另一种“绕过”它的方法是,如果你需要一个计数器或者每个初始化需要运行的东西,就是创build一个私有的静态内部类,如下所示:
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++; } }