@ Ответ Лайла довольно опасен, и я видел, что он не работает, особенно если вы сделаете enum статическим внутренним классом. Вместо этого я использовал что-то вроде этого, которое будет загружать карты 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'). Обычным решением является использование вложенного класса. –
Спасибо всем за такой быстрый ответ. (FWIW Я не нашел Sun Javadocs очень полезным для этой проблемы). –
Это проблема языка, а не проблема с библиотекой. Тем не менее, я думаю, что документы API читаются больше, чем JLS (хотя, возможно, не языковые дизайнеры), поэтому подобные вещи, вероятно, должны иметь большее значение в документах java.lang. –