Это из эффективной 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. Конструкторам перечисления не разрешен доступ к статическим полям перечисления, за исключением полей констант времени компиляции. Это ограничение необходимо, поскольку эти статические поля еще не были инициализированы при запуске конструкторов.
Мой вопрос касается строки:
«Обратите внимание, что константы операции помещаются в карту stringToEnum из статического блока, который запускается после создания констант».
Я думал, что статический блок выполняется до запуска конструктора. Они фактически выполняются во время загрузки класса.
Что мне здесь не хватает?