何时将静态嵌套类(以及其中的静态成员)加载到内存中?

Ami*_*mar 10 java singleton static-members nested-class

在这里,我试图使用内部静态助手类为我的数据库连接实现单例类:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我怀疑这个静态内部类ConnectionHelper何时被加载到JVM内存中:

在加载DatabaseConnection类时,还是在调用getInstance()方法时?

Wil*_*son 9

当类被加载时只是一个实现细节; 你想知道什么时候初始化类.它只会在第一次需要时才会被初始化,那就是你打电话的时候getInstance().

你是BTW使用懒惰的初始化持有者类idiom,它基于Java语言规范的这种保证.正如Josh Bloch所说,

这个成语几乎是神奇的.正在进行同步,但它是不可见的.Java Runtime Environment在幕后为您完成.许多虚拟机实际上修补了代码,以便在不再需要时消除同步,因此这个习惯用法非常快.


rup*_*ain 5

oracle 文档页面说:

注意:静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶层类,为了方便打包,它嵌套在另一个顶层类中。

它的加载方式与其他类的加载方式相同。