2016-05-01 13 views
-1

In meinem Java-Programm versuche ich sicherzustellen, dass nur ein Objekt der Klasse "ATM" erstellt wird. Dazu habe ich eine klassische Singletonklasse wie folgt:Erstellen eines Singleton-Objekts in Java

public class Singleton { 

    private static Singleton uniqueInstance; 

    private Singleton() {} 

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

} 

Wie stelle ich sicher, dass nur ein Objekt der Klasse ATM hergestellt wird? Z.B. Wo gebe ich jetzt den Code ein:

ATM theATM = new ATM();  

Gehört dieser Code in die Singleton-Klasse oder in die ATM-Klasse?

+0

@engineer - also dieser Code muss innerhalb der ATM-Klasse sein, anstatt in einem eigenen separaten Singleton-Klasse? –

+0

Singleton ist ein _muster_. Dies ist eine Vorlage zum Schreiben eines (nicht threadsicheren und fehleranfälligen) Singletons. Ich würde das überhaupt nicht verwenden und stattdessen das ['enum' Singleton-Muster] (http://stackoverflow.com/a/26285591/2071828) verwenden. –

Antwort

0

Sie benötigen diese Singleton Klasse nicht, weil Ihr Singleton ATM sein muss.

Also, das nur in ATM.java verwenden:

public class ATM { 

    private static ATM uniqueInstance; 

    private ATM() {} 

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

} 

Jetzt können Sie Ihre Linie anrufen:

nur, wenn Sie selbst sind in der ATM Klasse, weil Ihr Konstruktor private, aber das ist nutzlos, weil Sie in dieser Situation über uniqueInstance kümmern.

Wenn Sie in einer anderen Klasse sind, sollten Sie verwenden:

public class Main { 

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

} 

Die Idee des Singletonmuster ist, dass selbst wenn Sie wieder ATM.getInstance(); ausführen, die gleiche (initial) Instanz (uniqueInstance) zurückgegeben . Wenn es zuvor nicht initialisiert wurde, wird es initialisiert. Andernfalls wird die alte Instanz zurückgegeben. So sind Sie sicher, dass Sie nicht mehrere Instanzen haben.


Natürlich gibt es bessere Implementierungen des Singletons Muster, das Thread-sicher sind.

Z. B .:

  • Thread-sicher - faul:

    public class ATM { 
        private static ATM uniqueInstance = null; 
        private ATM(){} 
        public static synchronized ATM getInstance() { 
         if (uniqueInstance == null) { 
          uniqueInstance = new ATM(); 
         } 
         return uniqueInstance; 
        } 
    } 
    
  • Thread-sicher - eifrig

    public class ATM { 
        private static ATM uniqueInstance = new ATM(); 
        private ATM(){} 
        public static ATM getInstance() { 
         return uniqueInstance; 
        } 
    } 
    
  • Thread-sicher - mit Enum

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

Danke! Ich wurde verwirrt, dass (wie erwähnt) ein Singleton ein Design-Muster ist, also braucht es keine eigene Klasse. –

Verwandte Themen