Это очень распространенный одноэлементный код перечисления:
public enum enumClazz{
INSTANCE
enumClazz(){
//do something
}
}
и множество мест сказали, что это ленивая инициализация. Но я смущен после того, как прочитал главу 7 " Внутри виртуальной машины Java '- Время жизни типа:
Спецификация виртуальной машины Java предоставляет реализации гибкость в выборе времени загрузки и компоновки классов и интерфейса, но строго определяет время инициализации. Все реализации должен инициализировать каждый класс или интерфейс при его первом активном использовании. следующие шесть ситуаций квалифицируются как активное использование:
- Создается новый экземпляр класса (в байт-кодах, выполнение новой инструкции. В качестве альтернативы, посредством неявного создания, отражения, клонирования или десериализации.)
- Вызов статического метода, объявленного классом (в байт-кодах, выполнение invokestatic инструкции)
- Использование или назначение статического поля, объявленного классом или интерфейсом, за исключением статических полей, которые являются окончательными и инициализируются выражение константы времени компиляции (в байт-кодах, выполнение getstatic или putstatic)
- Вызов некоторых отражающих методов в Java API, таких как методы класса Class или классы в java.lang.reflect пакет
- Инициализация подкласса класса (инициализация класса требует предварительной инициализации его суперкласса.)
- Обозначение класса как исходного класса (с помощью метода main() <) при запуске виртуальной машины Java
Третья точка с жирным стилем уточняет, что если поле static final
, инициализация поля происходит во время компиляции. Аналогично, INSTANCE
в enumClazz
неявно равен public static final
и соответствует третьей точке.
Может ли кто-то исправить меня, если мое понимание неверно?