1
2

More than 1 year has passed since last update.

【新卒SE】Java入門 ~Singleton(シングルトン)とはなんぞや~

Last updated at Posted at 2022-05-11

 今日、研修でJavaの問題演習に取り組んでいた際に初めて知った概念?で、正直まだ理解が曖昧ですが、後学のために間違っていても良いので現状の考えを残そうと思い、アウトプットします(間違ってたら教えてくださいm(__)m)。

シングルトンとは

一言でいうと、
「1つのクラスからは1つのオブジェクト(インスタンス)しか作れないよ~」
ってことです。
通常、クラスから複数のオブジェクトを生成できると思います。例えば、以下の図のように
「Car クラス→TESLA・TOYOTA・BMW」と言ったように、複数のオブジェクトを通常は生成できます。
しかし、シングルトンの場合は、オブジェクトの生成の処理が一度しか行われないため、下図のようの1つのオブジェクトしか生成されません。なので、「このクラスからはオブジェクトを一つしか作りたくない!」というような時にシングルトンを使用します。
スクリーンショット 2022-05-11 21.56.16.png

実際に見てみる

obj1とobj2のメソッドの呼び出しで得られたオブジェクト(インスタンス)が同一のものである事を確かめます。

Singleton.java

public class Singleton {
  
    public static Singleton singleton; // singleton = null
    private int num;
    
    // ①メンバ変数numにアクセスするためのセッター
    public void setNum(int num) {
        this.num = num;
    }

    public static Singleton getSingleton(){
        if (singleton == null){
        // singletonがnullであればオブジェクト生成
            singleton = new Singleton(); 
            return singleton;
        }
        return singleton;
    }
    // ②メンバ変数numにアクセスするためのゲッター
    public int getNum(){
        return num;
    }
}

以下、実行ファイル。

StartUp.java

public class StartUp {

	public static void main(String[] args) {
		// メンバ変数の値を確認する。
        // ③Singleton型の変数obj1にsingletonオブジェクトでgetSingletonメソッドを呼び出す
		Singleton obj1 = Singleton.getSingleton(); 
		System.out.println("getSingleton()メソッド呼び出し(1回目)");
		System.out.println("numの値:"+obj1.getNum()); 

		// メンバ変数の値を確認する(変更後)。
		int num = 10;
		obj1.setNum(num); // ①に移動
		System.out.println("numの値:"+obj1.getNum()); // ②で実行された結果を返す

		// メンバ変数の値を確認する(オブジェクトの共有)
		System.out.println("getSingleton()メソッド呼び出し(2回目)");

        // Singleton型のsingletonTest変数に同じく③で使用したsingletonオブジェクトでgetSingletonメソッドを呼び出す
		Singleton obj2 = Singleton.getSingleton();
		System.out.println("numの値:"+obj2.getNum()); 
	}

}

実行結果

getSingleton()メソッド呼び出し(1回目)
numの値:0
numの値:10 // obj1
getSingleton()メソッド呼び出し(2回目)
numの値:10 // obj2

このように、obj1とobj2で得たオブジェクトが同じ結果(10)を表しているので同一のものであると分かります。

疑問点

Singletonに関して、調べているとどうやら、
・privateなコンストラクタを定義する必要がある
・生成したオブジェクト(インスタンス)はprivateのstatic変数に保存される
のようなルールがあるようですが、上記のコードではそれを守れていません。でもこれでもSingletonとして機能している気がするのですが、まだまだ勉強が必要です。。。またちゃんと分かり次第修正を加えていこうと思います。

1
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2