Java Singleton - verhindern Sie mehrfache Kreation durch Reflexion
Habe ich ein singleton ist wie diese.
public class BookingFactory {
private final static BookingFactory instance;
static {
instance = new BookingFactory();
}
public static BookingFactory getInstance() {
return instance;
}
private BookingFactory() {
System.out.println("Object is created.");
}
}
public class Test {
BookingFactory instance = BookingFactory.getInstance();
instance = BookingFactory.getInstance();
Class<?> clazz = Class.forName("com.test.BookingFactory");
Constructor pvtConstructor = clazz.getDeclaredConstructors()[0];
//Set its access control
pvtConstructor.setAccessible(true);
//Invoke Private Constructor
BookingFactory notSingleton = (BookingFactory) pvtConstructor.newInstance(null);
}
Wenn ich diesen starte, sah ich mehr als einen Ausdruck Nachricht. Gibt es eine Möglichkeit, dies zu verhindern singleton instanziiert wird mehr als einmal aus dieser Reflexion?
Dank.
InformationsquelleAutor der Frage user826323 | 2011-10-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie es mit einem
enum
. Enumerationen für gute Singletons.Können Sie nicht erstellen Sie eine enum über Reflexion.
Die getInstance () - Methode ist überflüssig, sondern macht es leichter zu führen Sie Ihren test, werfen die folgende Ausnahme:
Oh schau, schon jemand gab der enum-Antwort. Posting eh für mehr Vollständigkeit.
InformationsquelleAutor der Antwort laher
Machen die Behauptung in den Konstruktor:
InformationsquelleAutor der Antwort Bohemian
Angepasst Machen Sie den Java-Singleton-Reflexion den Nachweis bei der Verwendung von Lazy Loading:
Den Konstruktor hat eine überprüfen, um zu sehen, ob der Anrufer hat Zugang zu Ihr. Wie der link erklärt, eine policy-Datei erlaubt die Singleton-Klasse selbst aufrufen des Konstruktors erstellt werden müssen.
Böhmischen Methode eine Ausnahme werfen nicht verhindern, dass ein client aus reflektorisch durch Aufruf des Konstruktors vor getInstance() aufgerufen wird. Obwohl es sorgt dafür, dass nur eine Instanz erzeugt wird, gibt es keine Garantie, dass dies geschieht durch die Singleton-Klasse'
getInstance()
Methode.Access control check zu verhindern, dass dieses unerwünschte Instanziierung.
InformationsquelleAutor der Antwort simpatico
Empfehle ich die Lektüre Was ist eine effiziente Methode zum implementieren eines singleton-pattern in Java? - mit einem enum verhindert, dass das, was du beschreibst und ist der empfohlene Weg zur Implementierung eines singleton in java.
InformationsquelleAutor der Antwort Brian Roach
Wenn das singleton nicht wirklich speichern, dann Ihre beste option ist, nicht mit einem singleton. Stattdessen implementieren Sie die Fabrik als einen statischen Zustand-freie Methode.
InformationsquelleAutor der Antwort DwB
** Prüfung singleton**
InformationsquelleAutor der Antwort Deepak