Singleton
Singletonは、コンストラクタをprivateにすることによってインスタンスを一つしか作成できないようなクラスのことをSinglitonといいます。
コンストラクタをprivateにすると、他のクラスでSingletonクラスをインスタンス化できなくなります。

以下のSingletonクラスを見てください。

コンストラクタをprivateにする
public class Singleton{
    // privateなコンストラクタ
    private Singleton(){
        
    }

    // 以下省略
}
上記クラスを、他のクラスからSingleton sngltn = new Singleton();とするとエラーとなります。
これは、コンストラクタがprivateなため、他のクラスからインスタンスが作成することが不可能なためです。
このようにコンストラクタをprivateにすることにより、インスタンス化することを防ぎます。

では一つだけ作成するにはどうするかというと、privateなstatic変数としてSingletonクラスを保持し、その変数にはpublicなstaticメソッドからアクセスするようにします。
これで、一つだけしかインスタンスが存在しないことが保証されます。
具体的には、上記クラスを以下のように書き加えます。

Singletonクラス
public class Singleton{
    private static Singleton sngltn;
    // privateなコンストラクタ
    private Singleton(){
        
    }

    public static Singleton getInstance(){
        if(sngltn == null){
            sngltn = new Singleton();
        }
        return sngltn;
    }
}
これで、他のクラスからSingleton.getInstance();とすることでSingletonクラスのインスタンスを取得することができます。
このインスタンスは一つであることが保障されます。
getInstance内でインスタンスを作成すると、インスタンスが複数できる可能性が生じるため、変数宣言時にインスタンスを作成します。

参考文献
getInstanceメソッドが同時に実行された場合、2つの異なるインスタンスが返ってくる可能性があります。
これはマルチスレッドのため、メソッドが同時実行された場合に起こりえます。
回避策としてはstaticメソッドをsynchronizedする方法があります。が、これはインスタンス生成時の一度のみ有効でそれ以降は必要性がありません。
一般的にsynchronizedすると処理が遅くなります。

別の回避策としてはインスタンスを先に作成しておくという方法があります。
以下を見てください。

public class Singleton{
    private static Singleton sngltn = new Singleton();
    // privateなコンストラクタ
    private Singleton(){
        
    }

    public static Singleton getInstance(){
        return sngltn;
    }
}
このように先にインスタンスを生成しておくことでgetInstanceメソッドでは必ずひとつのインスタンスが返ってくるようにすることができます。

参考文献

Back to top

Information