@莱尔的回答是相当危险的,我已经看到了,如果你做的枚举静态内部类如果不是特别的工作。相反,我使用了这样的东西,它将在枚举之前加载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);
}
}
如果你有一个内部枚举你可以定义枚举定义地图上面,并且(在理论)应该在之前加载。
IIRC,它给出了一个NPE,因为静态初始化是自顶向下完成的(即顶部的枚举常量在构造到stringMap初始化之前被构造)。通常的解决方案是使用嵌套类。 – 2009-07-03 21:36:59
谢谢大家如此快速的回应。 (FWIW我没有发现Sun Javadocs对这个问题非常有用)。 – 2009-07-03 21:45:30
这实际上是一个语言问题,而不是一个图书馆问题。不过,我认为API文档比JLS更多地阅读(尽管可能不是语言设计者),所以像这样的东西在java.lang文档中可能会更突出。 – 2009-07-03 22:37:50