我刚刚得到Java5项目有这个错误,我尝试使用Java5和Java6,但它仍然存在.它以某种方式工作(因为它是在svn),我怎么能绕过编译器错误?
不要"绕过"错误 - 它不会做你想要的.错误是有充分理由的.
枚举值在任何其他静态字段之前初始化.如果你想做一些事情,比如将所有值添加到地图中,请在静态初始化程序之后执行其他操作:
import java.util.*; public enum Foo { BAR, BAZ; private static final MaplowerCaseMap; static { lowerCaseMap = new HashMap (); 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 MaplowerCaseMap = new HashMap<>(); private static int COUNTER = 0; } private Foo() { StaticFields.lowerCaseMap.put(this.name().toLowerCase(), this); StaticFields.COUNTER++; } }