Javaでシングルトンを実装する3つの方法
タグ: java / 初版公開: 2013-12-07

Javaでシングルトンを実装するには以下3つの方法がある。 それぞれ詳しく見てみよう。

  1. publicなstaticフィールドにインスタンスを保持する
  2. publicなstaticメソッドでインスタンスを返す
  3. 単一要素のenumを使う

1. publicなstaticフィールドにインスタンスを保持する

public class Singleton1 {
	public static final Singleton1 INSTANCE = new Singleton1();
	private Singleton1(){
		// Initialize instance
	}
}

publicstaticフィールドを定義し、インスタンスをこのフィールドに保持しておく方法だ。 同時にコンストラクタをprivateとして、外部からのインスタンス生成を防止する。

2. publicなstaticメソッドでインスタンスを返す

public class Singleton2 {
	private static final Singleton2 INSTANCE = new Singleton2();
	private Singleton2(){
		// Initialize instance
	}
	public static Singleton2 getInstance(){
		return INSTANCE;
	}
}

privatestaticフィールドを定義し、インスタンスをこのフィールドに保持する。 このインスタンスを返すpublicstaticメソッドを定義して、シングルトンを返却する方法だ。 コンストラクタをprivateとして、外部からのインスタンス生成を防止するのは方法 1.と変わらない。

生成をメソッド化したことにより、スレッド毎に固有のシングルトンを返却するなど、生成にバリエーションを持たせられることが利点である。

3. 単一要素のenumを使う

public enum Singleton3 {
	INSTANCE;
}

この方法はJava 1.5以降で利用できる。 単一要素のenumを定義し、これをシングルトンとして利用する方法だ。 enumの要素は複数作られることがないため、INSTANCEはこれだけでシングルトンとなる。

この方法が方法 1.方法 2.より優れているのは、リフレクションにより無理やりコンストラクタを呼び出したり、シリアライズ・デシリアライズによりインスタンスが複製されたりすることがない点だ。

シングルトンの参照

上記方法 1.から方法 3.で実装したシングルトンを参照する方法はそれぞれ以下のとおり。

public class Main {
	public static void main(String[] args) {
		Singleton1 s1 = Singleton1.INSTANCE;
		Singleton2 s2 = Singleton2.getInstance();
		Singleton3 s3 = Singleton3.INSTANCE;
	}
}

Javaでシングルトンを実装する詳細は、Effective Javaの項目3に詳しい。

Effective Java 第2版 (The Java Series)
Joshua Bloch
ピアソンエデュケーション
売り上げランキング: 88,031