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()方法时?
当类被加载时只是一个实现细节; 你想知道什么时候初始化类.它只会在第一次需要时才会被初始化,那就是你打电话的时候getInstance()
.
你是BTW使用懒惰的初始化持有者类idiom,它基于Java语言规范的这种保证.正如Josh Bloch所说,
这个成语几乎是神奇的.正在进行同步,但它是不可见的.Java Runtime Environment在幕后为您完成.许多虚拟机实际上修补了代码,以便在不再需要时消除同步,因此这个习惯用法非常快.
oracle 文档页面说:
注意:静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶层类,为了方便打包,它嵌套在另一个顶层类中。
它的加载方式与其他类的加载方式相同。