遅延初期化ホルダー

リソースなどを初期化する場合には、以下のようにstaticイニシャライザにて事前に初期化することが多い。

public class Hoge {
    private static Resource resource = new Resource();
    public static Resource getResource() { return resource;}
}


リソースの初期化を、実際に使用する時まで遅らせたい場合には、以下のような遅延初期化を行う。

public class Hoge {
    private static Resource resource;
    public synchronized static Resource getResource() {
        if(resource == null) resource = new Resource();
        return resource;
    }
}


しかし、getResource() の呼び出しが多く、同期のコストが問題となる場合には、次のような遅延初期化ホルダーを使用すると良い。

public class Hoge {
    private static class ResourceHolder {
        public static Resource resource = new Resource();
    }

    public static Resource getResource() {
        return ResourceHolder.resource;
    }
}

ResourceHolder の初期化は、ResourceHolder が実際に使われる時に行われる。つまり、初めて getResource() が呼ばれた段階で、ResourceHolder 読み込まれ、Resource がstaticイニシャライザで初期化されるため、明示的な同期処理が不要となる。