@Lyle 的回答相当危险,我发现它不起作用,特别是如果您将枚举设为静态内部类。相反,我使用了类似这样的东西,它将在枚举之前加载 BootstrapSingleton 映射。
编辑 这对于现代 JVM(JVM 1.6 或更高版本)应该不再是问题,但我确实认为 JRebel 仍然存在问题,但我没有机会重新测试它。
先加载我:
public final class BootstrapSingleton {
// Reverse-lookup map for getting a day from an abbreviation
public static final Map<String, Day> lookup = new HashMap<String, Day>();
}
现在在枚举构造函数中加载它:
public enum Day {
MONDAY("M"), TUESDAY("T"), WEDNESDAY("W"),
THURSDAY("R"), FRIDAY("F"), SATURDAY("Sa"), SUNDAY("Su"), ;
private final String abbreviation;
private Day(String abbreviation) {
this.abbreviation = abbreviation;
BootstrapSingleton.lookup.put(abbreviation, this);
}
public String getAbbreviation() {
return abbreviation;
}
public static Day get(String abbreviation) {
return lookup.get(abbreviation);
}
}
如果你有一个内部枚举,你可以在枚举定义之上定义 Map 并且(理论上)应该在之前加载。