Это от эффективной Java:
// Implementing a fromString method on an enum type
private static final Map<String, Operation> stringToEnum
= new HashMap<String, Operation>();
static { // Initialize map from constant name to enum constant
for (Operation op : values())
stringToEnum.put(op.toString(), op);
}
// Returns Operation for string, or null if string is invalid
public static Operation fromString(String symbol) {
return stringToEnum.get(symbol);
}
Обратите внимание, что константы операции помещаются на карту stringToEnum из статического блока, который запускается после создания констант. Пытаясь заставить каждую константу вставлять себя в карту из своих собственных конструктор вызовет ошибку компиляции. Это хорошая вещь, потому что это вызовет исключение NullPointerException, если оно будет законным. Enum конструкторам arent разрешен доступ к статическим полям enums, кроме полей постоянной времени компиляции. Это ограничение необходимо поскольку эти статические поля еще не были инициализированы, когда выполняются конструкторы.
Мой вопрос касается линии:
"Обратите внимание, что константы операции помещаются в карту stringToEnum из статического блока, который запускается после создания констант".
Я думал, что статический блок запускается до запуска конструктора. Фактически они выполняются во время загрузки класса.
Что мне здесь не хватает?