Идиома держателя инициализации по требованию - Когда загружаются классы? - PullRequest
0 голосов
/ 15 мая 2018

Я искал: https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom, чтобы понять немного больше о синглетонах.

Мой вопрос: когда именно статический внутренний класс получает Loaded и когда он инициализируется?Насколько я понимаю, классы могут быть загружены, но остаются неинициализированными до тех пор, пока инициализация не станет абсолютно необходимой.

Если класс не загружен, как определяется частный статический внутренний класс в JVM?

1 Ответ

0 голосов
/ 15 мая 2018

Точное время инициализации класса указано в Спецификации языка Java®, §12.4.1

§12.4.1.Когда происходит инициализация

Класс T или интерфейсный тип T будут инициализированы непосредственно перед первым возникновением любого из следующего:

  • T - это класс и экземпляр T создано.
  • Вызван метод static, объявленный T.
  • A static поле, объявленное T, назначено.
  • Astatic поле, объявленное T, используется, и поле не является константной переменной ( §4.12.4 ).
  • T является классом верхнего уровня (§7.6 ) и оператор assert ( §14.10 ), лексически вложенный в T ( §8.1.3 ), выполняется.

Когда класс инициализируется, инициализируются его суперклассы (если они не были предварительно инициализированы), а также любые суперинтерфейсы ( §8.1.5 ), которые объявляют любые методы по умолчанию ( §9.4.3 ) (если они не были предварительно инициализированы).Инициализация интерфейса сама по себе не вызывает инициализацию любого из его суперинтерфейсов.

Последний маркер был удален в Java 9

Времякласса загрузка не является фиксированной и может зависеть от деталей реализации, например, от того, как был реализован верификатор.Но очевидно, что это должно произойти до инициализации.

С точки зрения JVM, тот факт, что это вложенный класс, не имеет особого значения.Существует символическая ссылка на внутренний класс во внешнем классе ' константный пул , как и для любого другого ссылочного класса.Это будет разрешено при необходимости.

...