Japanese / English
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
Information
社長ブログ


運営サイト




広告



Google Search
PV
SEO対策 大阪  税理士 相談  税理士 守口市  税理士 大阪市  税理士 枚方市  自動車ガラス 神戸  シール印刷 神戸  ブリリアントアパートメント  株式会社CONFRAGE  英会話 個人レッスン 京都市右京区  京都市右京区西京区でマンツーマン英会話 
このページはCONFRAGEの著作物です。このページを複製・転載することを禁じます。CopyRight(C)2003-2016 CONFRAGE All rights reserved.