リソースなどを初期化する場合には、以下のように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イニシャライザで初期化されるため、明示的な同期処理が不要となる。