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

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

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 делает это за вас, за кулисами. И многие виртуальные машины на самом деле исправляют код, чтобы устранить синхронизацию, когда в ней больше нет необходимости, поэтому эта идиома чрезвычайно быстрая.

Страница оракула говорит:

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

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

Другие вопросы по тегам