@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);
}
}
内部列挙型がある場合は、列挙型定義の上にマップを定義するだけで、(理論的には)前にロードする必要があります。
stringMap
初期化に至る前に、上部の列挙型定数が構築されます)。通常の解決策は、ネストされたクラスを使用することです。