今日、研修でJavaの問題演習に取り組んでいた際に初めて知った概念?で、正直まだ理解が曖昧ですが、後学のために間違っていても良いので現状の考えを残そうと思い、アウトプットします(間違ってたら教えてくださいm(__)m)。
シングルトンとは
一言でいうと、
「1つのクラスからは1つのオブジェクト(インスタンス)しか作れないよ~」
ってことです。
通常、クラスから複数のオブジェクトを生成できると思います。例えば、以下の図のように
「Car クラス→TESLA・TOYOTA・BMW」と言ったように、複数のオブジェクトを通常は生成できます。
しかし、シングルトンの場合は、オブジェクトの生成の処理が一度しか行われないため、下図のようの1つのオブジェクトしか生成されません。なので、「このクラスからはオブジェクトを一つしか作りたくない!」というような時にシングルトンを使用します。
実際に見てみる
obj1とobj2のメソッドの呼び出しで得られたオブジェクト(インスタンス)が同一のものである事を確かめます。
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;
}
}
以下、実行ファイル。
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として機能している気がするのですが、まだまだ勉強が必要です。。。またちゃんと分かり次第修正を加えていこうと思います。