2016-05-01 4 views
-1

私のJavaプログラムでは、クラス「ATM」のオブジェクトが1つだけ作成されるようにしています。このために、私は以下のように古典的なシングルトンクラスを持っている:Javaでシングルトンオブジェクトを作成する

public class Singleton { 

    private static Singleton uniqueInstance; 

    private Singleton() {} 

    public static Singleton getInstance() { 
     if (uniqueInstance == null) { 
      uniqueInstance = new Singleton(); 
     } 
     return uniqueInstance; 
    } 

} 

は、どのように私はクラスのATMの1つのオブジェクトのみが行われていることを確認していますか?例えば。今どこにコードを入力しますか:

ATM theATM = new ATM();  

このコードは、シングルトンクラスに属するのか、またはATMクラスに属していますか?

+0

@engineer - だから、このコードではなく、それ自身の個別のシングルトンクラスに比べて、ATMクラス内にあることが必要ですか? –

+0

シングルトンは_pattern_です。これは、(スレッドセーフではなくエラーが発生しやすい)シングルトンを書くためのテンプレートです。私はこれをまったく使用せず、代わりに['enum'シングルトンパターン](http://stackoverflow.com/a/26285591/2071828)を使用します。 –

答えて

0

あなたのシングルトンはATMでなければならないので、Singletonクラスは必要ありません。だから、

、ちょうどATM.javaでこれを使用します。

public class ATM { 

    private static ATM uniqueInstance; 

    private ATM() {} 

    public static ATM getInstance() { 
     if (uniqueInstance == null) { 
      uniqueInstance = new ATM(); 
     } 
     return uniqueInstance; 
    } 

} 

、あなたの行を呼び出すことができます。

あなたのコンストラクタがあるので、あなたは、ATMクラス自体にある場合にのみ、 privateですが、この状況ではuniqueInstanceを気にするので、これは役に立たないです。

あなたが別のクラスにある場合は、あなたが使用する必要があります。

public class Main { 

    public static void main(String[] args) { 
     ATM theATM = ATM.getInstance(); 
    } 

} 

シングルトンパターンのアイデアは、あなたが再びATM.getInstance();実行した場合でも、同じ(初期)のインスタンス(uniqueInstance)が返されるということです。前に初期化されていない場合は、初期化されます。それ以外の場合は、古いインスタンスが返されます。だから、これはあなたが複数のインスタンスを持たないことを確信する方法です。


もちろん、スレッドセーフであるシングルトンパターンの実装が優れています。

例えば:

  • スレッドセーフ - 怠惰

    public class ATM { 
        private static ATM uniqueInstance = null; 
        private ATM(){} 
        public static synchronized ATM getInstance() { 
         if (uniqueInstance == null) { 
          uniqueInstance = new ATM(); 
         } 
         return uniqueInstance; 
        } 
    } 
    
  • スレッドセーフ - 熱心

    public class ATM { 
        private static ATM uniqueInstance = new ATM(); 
        private ATM(){} 
        public static ATM getInstance() { 
         return uniqueInstance; 
        } 
    } 
    
  • スレッドセーフ - 使用して列挙

    public enum ATM { 
        UNIQUE_INSTANCE; 
        ... 
    } 
    
+0

ありがとうございました!私は(言及したように)シングルトンがデザイン_パターン_であることを混乱させていたので、それはそれ自身のクラスである必要はありません。 –

関連する問題