Когда статический вложенный класс (и статические члены в нем) загружается в память?
Здесь я пытался реализовать одноэлементный класс для подключения к базе данных, используя внутренний статический вспомогательный класс:
package com.myapp.modellayer;
public class DatabaseConnection {
private DatabaseConnection() {
//JDBC code...
}
private static class ConnectionHelper {
// Instantiating the outer class
private static final DatabaseConnection INSTANCE = new DatabaseConnection();
}
public static DatabaseConnection getInstance() {
return ConnectionHelper.INSTANCE;
}
}
Однако я сомневаюсь, когда этот статический внутренний класс ConnectionHelper загружается в память JVM:
Во время загрузки класса DatabaseConnection или во время вызова метода getInstance()?
2 ответа
Когда класс загружается, это просто деталь реализации; Вы хотите знать, когда класс инициализируется. Он будет инициализирован только тогда, когда это будет необходимо, и именно тогда вы позвоните getInstance()
,
Кстати, вы используете ленивую идиому класса держателя инициализации, которая основана именно на этой гарантии в Спецификации языка Java. Как сказал Джош Блох,
Эта идиома почти волшебна. Синхронизация происходит, но она невидима. Java Runtime Environment делает это за вас, за кулисами. И многие виртуальные машины на самом деле исправляют код, чтобы устранить синхронизацию, когда в ней больше нет необходимости, поэтому эта идиома чрезвычайно быстрая.
Страница оракула говорит:
Примечание. Статический вложенный класс взаимодействует с членами экземпляра своего внешнего класса (и других классов) так же, как и любой другой класс верхнего уровня. По сути, статический вложенный класс является поведенческим классом верхнего уровня, который был вложен в другой класс верхнего уровня для удобства упаковки.
Вы загружаетесь так же, как загружаются другие классы.