Когда статический вложенный класс (и его статические члены) загружается в память?

Здесь я пытался реализовать одноэлементный класс для подключения к базе данных, используя внутренний статический вспомогательный класс:

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()?


person Amitesh Rai    schedule 07.08.2014    source источник
comment
Обратите внимание, что static в static class не имеет то же значение, что и static в объявлении члена в Java. Это просто означает, что это вложенный не внутренний класс .   -  person user2864740    schedule 08.08.2014
comment
В статических вложенных классах нет ничего особенного. Они загружаются так же, как нестатические и/или не вложенные классы. Для JVM все классы одинаковы, и она не понимает вложения так, как это делает Java.   -  person Peter Lawrey    schedule 08.08.2014


Ответы (2)


Когда класс загружается, это просто деталь реализации; вы хотите знать, когда класс будет инициализирован. Он будет инициализирован только тогда, когда он впервые понадобится, и именно тогда вы вызовете getInstance().

Кстати, вы используете идиому класса держателя ленивой инициализации, которая основанный именно на этой гарантии Спецификации языка Java. Как сказал Джош Блох,

Эта идиома почти волшебна. Синхронизация идет, но ее не видно. Java Runtime Environment делает это за вас, за кулисами. И многие виртуальные машины фактически исправляют код, чтобы устранить синхронизацию, когда в ней больше нет необходимости, поэтому эта идиома работает очень быстро.

person William F. Jameson    schedule 07.08.2014
comment
Я где-то читал об этом механизме безопасности потоков, широко используемом в шаблоне проектирования Singleton, но не был уверен в загрузке классов. - person Amitesh Rai; 08.08.2014

На странице документа оракула говорится:

Примечание. Статический вложенный класс взаимодействует с членами экземпляра своего внешнего класса (и других классов) так же, как и любой другой класс верхнего уровня. По сути, статический вложенный класс по поведению является классом верхнего уровня, который был вложен в другой класс верхнего уровня для удобства упаковки.

Вы загружаете его так же, как загружаются другие классы.

person rupesh jain    schedule 07.08.2014
comment
Это должен быть принятый ответ на вопрос, потому что он точно объясняет, что спросил пользователь. Принятый ответ даже не имеет отношения к вопросу. - person Rakesh Yadav; 30.10.2017
comment
@RakeshYadav да согласен - person rupesh jain; 30.10.2017