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