Java - シングルトンパターンの実装

シングルトンは、実行中のJavaプログラムでオブジェクトが1つだけ生成され使用されることを保証するパターンです。

この記事では、シングルトンパターンを実装する方法について説明します。

メソッド 1. Static オブジェクトの作成と初期化

以下の例のように、 sInstanceをstatic変数を宣言するときに初期化してgetメソッドを提供して使用すると、オブジェクトが1つだけ生成されることを保証できます。

しかし、この方法の欠点は、プログラムが終了するまでオブジェクトを一度も使用しなくても、オブジェクトが常に生成されてメモリを消費することです。

public class Example {

    public final static class Singleton {
        private static Singleton sInstance = new Singleton();

        private Singleton() {
        }

        public static Singleton getInstance() {
            return sInstance;
        }

        public void doSomething () {
            System.out.println("Do something");
        }
    }

    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
        singleton.doSomething();
    }
}

上記の実装方法の特徴は次のとおりです。

  • Singleton クラスのコンストラクタは private に設定し、外部からオブジェクトを生成するのを防ぎます。
  • Signleton クラスを返す get メソッド (getInstance) は public static として提供され、外部ではこのメソッドを呼び出してオブジェクトを取得する必要があります
  • Singleton クラスを final として宣言し、他のクラスから継承しないようにする

メソッド 2. オブジェクトが必要な場合、作成および初期化 (Lazy)

この方法は、シングルトンオブジェクトが実際に使用されるときにオブジェクトを生成し、必要でない場合はオブジェクトを生成しないため、不要なオブジェクトの生成を防止する方法である。

これを実装するために getInstance() は以下のように動作しなければなりません。

  • オブジェクトを作成しなかった場合は、作成後にオブジェクトをリ
  • オブジェクトが作成されたら、

次のようにシングルトンクラスを実装できます。

public class Example1 {

    public final static class Singleton {
        private static Singleton sInstance;

        private Singleton() {
        }

        public static Singleton getInstance() {
            synchronized (Singleton.class) {
                if (sInstance == null) {
                    sInstance = new Singleton();
                }
            }
            return sInstance;
        }

        public void doSomething () {
            System.out.println("Do something");
        }
    }

    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
        singleton.doSomething();
    }
}

上記の実装方法の特徴は次のとおりです。

  • Singleton クラスのコンストラクタは private に設定し、外部からオブジェクトを生成するのを防ぎます。
  • Signleton クラスを返す get メソッド (getInstance) は public static として提供され、外部ではこのメソッドを呼び出してオブジェクトを取得する必要があります
  • getInstance() は必要に応じてオブジェクトを生成して返します。
  • Singleton クラスを final として宣言し、他のクラスから継承しないようにする
codechachaCopyright ©2019 codechacha