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;
...
}
@engineer - also dieser Code muss innerhalb der ATM-Klasse sein, anstatt in einem eigenen separaten Singleton-Klasse? –
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. –