Domanda

È necessario affermare.

Ho una lezione:

public class ComponentFactory {
    private static LibraryFrame libraryFrame;

    public static synchronized LibraryFrame getLibraryFrame() {
        if (libraryFrame == null) {
           libraryFrame = new LibraryFrame();
        }
        return libraryFrame;
    }
}

Ora è necessario utilizzare come:

LibraryFrame libraryFrame = ComponentFactory.getLibraryFrame();
Assert.notNull(libraryFrame);
// other part

Qui Assert Class è org.springframework.util.assert.

Se l'affermazione non è riuscita, c'è comunque per chiamare System.Exit (0) dopo che si è verificato un guasto?

È stato utile?

Soluzione

L'affermazione non è necessario poiché il LibraryFrame L'istanza verrà sempre inizializzata a questo punto.

Altri suggerimenti

Secondo La documentazione per quella classe, è davvero destinato ad essere utilizzato con un metodo per validare i suoi argomenti. (Cioè, è destinato all'applicazione di precondizioni.) Dovresti avere test unitari per ComponentFactory, e dovrebbero affermare che è statico getLibraryFrame() Il metodo non ritorna null, ma non vale la pena affermarlo in fase di esecuzione.

Bene, quando si utilizza la classe Assert da Junit, qualsiasi metodo è tutto vuoto, ma utilizza il framework Junit per dirti se il test è passato o non è riuscito.

Se questo è un metodo per il test unitario, hai eseguito il test, ma se questo è stato per il runtime, utilizzare una condizione if.

Consiglio di usare il pattern inizializzazione su richiesta (cioè pigro caricamento singleton) per il tuo singleton. In questo modello se la costruzione dell'istanza fallisce otterrai un'eccezione, altrimenti otterrai l'oggetto.

Questo migliora la tua soluzione in due modi: non ha il sovraccarico della sincronizzazione e non ha il sovraccarico del Assert. Entrambi i metodi gettano un'eccezione se l'oggetto singleton non viene creato: nel tuo codice otterrai un IllegalArgumentException dall'affermazione.

L'uso di init-on-demand il tuo codice sarebbe:

public class ComponentFactory 
{
  private ComponentFactory() 
  {
  }

  private static class LazyHolder 
  {
    public static final LibraryFrame INSTANCE = new LibraryFrame();
  }

  public static LibraryFrame getLibraryFrame() 
  {
    return LazyHolder.INSTANCE;
  }
}

Usarlo sarebbe comunque:

LibraryFrame libraryFrame = ComponentFactory.getLibraryFrame();

... tranne che non hai più bisogno di né il Assert né il Synchronized.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top