Почему конструктор enum не может получить доступ к статическим полям и методам? Это совершенно верно для класса, но не допускается для перечисления.
Я пытаюсь сохранить экземпляры перечисления на статической карте. Рассмотрим этот пример кода, который позволяет выполнять поиск по сокращению:
public enum Day {
Sunday("Sun"), Monday("Mon"), Tuesday("Tue"), Wednesday("Wed"), Thursday("Thu"), Friday("Fri"), Saturday("Sat");
private final String abbreviation;
private static final Map<String, Day> ABBREV_MAP = new HashMap<String, Day>();
private Day(String abbreviation) {
this.abbreviation = abbreviation;
ABBREV_MAP.put(abbreviation, this); // Not valid
}
public String getAbbreviation() {
return abbreviation;
}
public static Day getByAbbreviation(String abbreviation) {
return ABBREV_MAP.get(abbreviation);
}
}
Это не сработает, поскольку enum не допускает статических ссылок в своем конструкторе. Однако он работает просто найти, если реализован как класс:
public static final Day SUNDAY = new Day("Sunday", "Sun");
private Day(String name, String abbreviation) {
this.name = name;
this.abbreviation = abbreviation;
ABBREV_MAP.put(abbreviation, this); // Valid
}
final
). Думаю, поймать его будет сложно!EnumSet.allOf
вместоEnum.values()
? Я спрашиваю, потому чтоvalues
это своего рода фантомный метод (не вижу источникEnum.class
), и я не знаю, когда он был созданEnum.values()
будет быстрее, если вы планируете повторять их с помощью расширенного цикла for (поскольку он возвращает массив), но в основном это касается стиля и варианта использования. Вероятно, лучше использовать,EnumSet.allOf()
если вы хотите написать код, который существует в документации Java, а не только в спецификациях, но многие люди, похоже, вEnum.values()
любом случае знакомы с ним .Цитата из JLS, раздел «Объявления тела перечисления» :
источник
может это то, что ты хочешь
источник
Collections.unmodifiableMap()
здесь является очень хорошей практикой. +1Проблема решена с помощью вложенного класса. Плюсы: короче и лучше по потреблению ЦП. Минусы: еще один класс в памяти JVM.
источник
Когда класс загружается в JVM, статические поля инициализируются в том порядке, в котором они появляются в коде. Например,
На выходе будет 0. Обратите внимание, что инициализация test4 происходит в процессе статической инициализации, и в это время j еще не инициализирован, как он появится позже. Теперь, если мы изменим порядок статических инициализаторов так, чтобы j был перед test4. На выходе будет 6. Но в случае Enums мы не можем изменить порядок статических полей. Первым делом в enum должны быть константы, которые на самом деле являются статическими конечными экземплярами типа enum. Таким образом, для перечислений всегда гарантируется, что статические поля не будут инициализированы перед константами перечисления. Поскольку мы не можем давать какие-либо разумные значения для статических полей для использования в конструкторе перечисления , было бы бессмысленно обращаться к ним в конструкторе перечисления.
источник