Невозможно выполнить статическую инициализацию перед инициализацией элементов перечисления в Java, поскольку элементы перечисления всегда должны быть сначала объявлены и инициализированы.
Если статическая инициализация не зависит от элементов перечисления, порядок ее выполнения после элементов не является проблемой. В противном случае, если инициализация зависит от элементов перечисления, это вызовет проблемы. Однако перечисления Java предоставляют метод values(), способный удовлетворить эту зависимость. Но вызов values() может быть накладным, потому что метод values() каждый раз копирует внутренний статический массив.
Например (отредактировано в сообщении Почему конструктор перечисления не может получить доступ к статическим полям? а>):
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>();
static
{
for(Day day:values())
ABBREV_MAP.put(day.abbreviation, day);
}
private Day(String abbreviation) {
this.abbreviation = abbreviation;
//ABBREV_MAP.put(abbreviation, this); this is not valid
}
public String getAbbreviation() {
return abbreviation;
}
public static Day getByAbbreviation(String abbreviation) {
return ABBREV_MAP.get(abbreviation);
}
}
Как видно из примера, мне не нужен статический блок кода инициализации, поэтому вызов метода values(), который делает копию, если бы я мог инициализировать HashMap перед элементами перечисления. Кода, закомментированного в конструкторе, будет достаточно.
Мой вопрос заключается в том, что, поскольку обязательство инициализации элементов перечисления сначала может привести к ненужным накладным расходам, можно ли устранить эти накладные расходы или, другими словами, возможно ли выполнить статическую инициализацию перед элементами перечисления? Если нет, то только ради удобочитаемости кода? Я предполагаю, что объявление элементов enum сначала не имеет ничего общего с безопасной инициализацией, как упоминалось в некоторых ответах.
В этом вопросе я отмечаю накладные расходы, хотя в большинстве случаев они небольшие, по крайней мере, они достойны глубокого понимания и, возможно, мозгового штурма.