@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,并且(理论上)应该在此之前加载。
stringMap
初始化之前进行构造的)。通常的解决方案是使用嵌套类。