2020/03/21

Initialization-on-demand holder idiom

Initialization-on-demand holder とは?

Nested static class が使えて、そのクラスの初期化が、そのクラスに初めてアクセスされたときに行われるようになっている言語では、Initialization-on-demand holder という idiom で変数の遅延初期化を行うことができます。
クラスの初期化は同期化されているはずなので、マルチスレッドプログラムでも多重に初期化が実行されることはありません。また、アウト・オブ・オーダー実行によって初期化が不完全な変数を参照してしまうこともありません。
シングルトンインスタンスの遅延初期化によく用いられます。

Java の場合

public final class Singleton {
  private static final class SingletonHolder {
    private static final Singleton instance = new Singleton();
  }

  private Singleton() {
  }

  public static Singleton getInstance() {
    return SingletonHolder.instance;
  }
}

Groovy の場合

Groovy では、@Lazy アノテーションを使うと、AST 変換により Initialization-on-demand holder idiom 相当のコードが生成されます。便利ですね!

class Singleton {
  @Lazy static Singleton instance = new Singleton()
}