Behaupten nicht null eines Singleton -Objekts
Frage
Ist es notwendig, ein Singleton -Objekt zu behaupten?
Ich habe ein klasse:
public class ComponentFactory {
private static LibraryFrame libraryFrame;
public static synchronized LibraryFrame getLibraryFrame() {
if (libraryFrame == null) {
libraryFrame = new LibraryFrame();
}
return libraryFrame;
}
}
Jetzt muss es verwendet werden als:
LibraryFrame libraryFrame = ComponentFactory.getLibraryFrame();
Assert.notNull(libraryFrame);
// other part
Hier gilt die Klasse org.springframework.util.assert.
Wenn die Behauptung fehlgeschlagen ist, gibt es ohnehin, um System zu rufen.exit (0) nach einem Ausfall?
Lösung
Die Behauptung ist nicht notwendig, da die LibraryFrame
Die Instanz wird an diesem Punkt immer initialisiert.
Andere Tipps
Entsprechend Die Dokumentation für diese Klasse, Es ist wirklich beabsichtigt, nach einer Methode zu verwenden, um seine Argumente zu gültig. (Das heißt, es ist für die Durchsetzung von vorgesehen Voraussetzungen.) Sie sollten Einheitstests für haben ComponentFactory
, und sie sollten behaupten, dass es statisch ist getLibraryFrame()
Methode kehrt nicht zurück null
, Aber es lohnt sich nicht, dies zur Laufzeit zu behaupten.
Nun, wenn Sie die Assert -Klasse von Junit verwenden, ist jede Methode dort für nichtig, aber sie verwendet das JUnit -Framework, um Ihnen mitzuteilen, ob der Test bestanden oder fehlgeschlagen ist.
Wenn diese Methode für Unit -Tests ist, haben Sie Ihren Test durchgeführt. Wenn dies jedoch für die Laufzeit eingesetzt wurde, verwenden Sie einen If -Zustand.
Ich empfehle die Verwendung der Initialisierung-auf-Demand-Muster (dh faul laden Singleton) für Ihren Singleton. In diesem Muster, wenn die Konstruktion der Instanz fehlschlägt, erhalten Sie eine Ausnahme, andernfalls erhalten Sie das Objekt.
Dies verbessert Ihre Lösung auf zwei Arten: Sie hat nicht den Overhead der Synchronisation und hat nicht den Overhead der Assert
. Beide Methoden machen eine Ausnahme, wenn das Singleton -Objekt nicht erstellt wird - in Ihrem Code erhalten Sie eine IllegalArgumentException
Aus dem Assert.
Mithilfe von Init-on-Demand ist Ihr Code:
public class ComponentFactory
{
private ComponentFactory()
{
}
private static class LazyHolder
{
public static final LibraryFrame INSTANCE = new LibraryFrame();
}
public static LibraryFrame getLibraryFrame()
{
return LazyHolder.INSTANCE;
}
}
Es zu benutzen wäre immer noch:
LibraryFrame libraryFrame = ComponentFactory.getLibraryFrame();
... außer dass Sie nicht mehr die brauchen Assert
Noch der Synchronized
.