在这里,我试图使用内部静态助手类为我的数据库连接实现单例类:
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() 方法的时候?
答案 0 :(得分:8)
当类加载时只是一个实现细节;你想知道什么时候初始化。只有在第一次需要时才会初始化它,也就是当你调用getInstance()
时。
您正在使用基于Java语言规范的完全保证的lazy initialization holder class idiom。正如Josh Bloch所说,
这个成语几乎是神奇的。正在进行同步,但它是不可见的。 Java Runtime Environment在幕后为您完成。许多虚拟机实际上修补了代码,以便在不再需要时消除同步,因此这个习惯用法非常快。
答案 1 :(得分:3)
oracle doc页面说:
注意:静态嵌套类与其实例成员交互 外部类(和其他类)就像任何其他顶级类一样。 实际上,静态嵌套类在行为上是顶级类 已经嵌套在另一个顶级类中进行打包 便利性。
它的加载方式与加载其他类的方式相同。