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

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


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

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

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

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

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

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

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

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

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

参考文献

Back to top

Information