私はシングルトン、特にシングルトンの遅延初期化と熱心な初期化に関していくつかの調査を行っていました。
熱心な初期化の例:
public class Singleton
{
//initialzed during class loading
private static final Singleton INSTANCE = new Singleton();
//to prevent creating another instance of Singleton
private Singleton(){}
public static Singleton getSingleton(){
return INSTANCE;
}
}
しかし、上記のように熱心な初期化であり、スレッドの安全性は jvm に任されていますが、今は同じパターンを遅延初期化で行いたいと考えています。
だから私はこのアプローチを思いつきます:
public final class Foo {
private static class FooLoader {
private static final Foo INSTANCE = new Foo();
}
private Foo() {
if (FooLoader.INSTANCE != null) {
throw new IllegalStateException("Already instantiated");
}
}
public static Foo getInstance() {
return FooLoader.INSTANCE;
}
}
上図のように
private static final Foo INSTANCE = new Foo();
クラス FooLoader が実際に使用されたときにのみ実行されます。これにより、遅延インスタンス化が処理され、スレッドセーフであることが保証されます。
これは正しいです?