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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top