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

时间:2014-08-07 21:29:04

标签: 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;
    }
}

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

加载 DatabaseConnection 类时,或 在调用 getInstance() 方法的时候?

2 个答案:

答案 0 :(得分:8)

当类加载只是一个实现细节;你想知道什么时候初始化。只有在第一次需要时才会初始化它,也就是当你调用getInstance()时。

您正在使用基于Java语言规范的完全保证的lazy initialization holder class idiom。正如Josh Bloch所说,

  

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

答案 1 :(得分:3)

oracle doc页面说:

  

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

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