Мы уже разобрали, из чего состоит enum и как его использовать. Сегодня разберём, как загружаются классы и экземпляры enum. Поможет нам в этом душноватый вопрос с собеседований, который находится выше.
Классы в JVM загружаются по мере необходимости. Что происходит при первом вызове new User():
🔹 Загрузка класса User, создание экземпляра User.class
🔹 Инициализируются статические переменные и выполняются блоки static {...}
Дальше переходим к созданию объекта:
🔸 Создаются явно указанные поля и выполняются блоки { }
🔸 Вызов конструктора класса и суперклассов
Внутри инициализирующего блока понадобился класс State. Переходим к нему.
Enum State компилируется в такую штуку:
public final class State extends Enum {
public static final State NEW;
public static final State VALIDATED;
// init блок
State() {...}
// static блок
}
Возникла проблема. Перед вызовом конструктора надо закончить со статическими полями. А статические поля - экземпляры этого же класса. Замкнутый круг.В такой ситуации JVM создаёт экземпляры NEW и VALIDATED перед статическими блоками. Получается такой порядок:
1️⃣ Создаём экземпляр State NEW:
▫️блок инициализации S-Init
▫️конструктор S-Constr
2️⃣ Повторяем тот же процесс для VALIDATED
3️⃣ Выполняем статический блок S-Static
Поэтому правильный ответ - G:
▫️enum NEW(Init-Constr)
▫️enum VALIDATED(Init-Constr)
▫️enum-Static
▫️объект User (Init-Constr)