シングルトンは、実行中の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 として宣言し、他のクラスから継承しないようにする
Related Posts
- Java - BufferedReaderでファイルを読む
- Java - BufferedWriterでファイルを書き込む
- Java - BigIntegerの範囲、比較、演算、キャスト
- Java charAt()関数を学ぶ
- Java contains()で文字(大文字と小文字のX)を含める
- Java - Set(HashSet)を配列に変換する
- Java - 文字列の最初の文字、最後の文字を確認する
- Java - 文字列を1文字ずつ切り捨てる
- Java - 文字列の単語数を取得する
- Java - 1秒ごとに繰り返し実行
- Java - 配列をSet(HashSet)に変換する
- Java - 複数のSet(HashSet)を組み合わせる
- Java - コマンドライン引数の入力を受け取る
- Java - リスト逆順に巡回、3つの方法
- Java - 特定の条件でリストをフィルタリングする3つの方法
- Java - HashMapすべての要素の合計、平均計算
- Java - 特定の条件でHashMapをフィルタリングする
- Java - シングルトンパターンの実装
- Java - 数字の左側にゼロを埋める
- Java - String配列の初期化方法
- Java - ソートされた順序で Map(HashMap) 巡回