Question

Faut-il Assert.notNull d'un objet Singleton?

J'ai une classe:

public class ComponentFactory {
    private static LibraryFrame libraryFrame;

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

est-il nécessaire d'utiliser comme:

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

Ici classe Assert est org.springframework.util.Assert.

Si Assertion échoué est là de toute façon d'appeler System.exit (0) après avariée?

Était-ce utile?

La solution

Le Assertion est pas nécessaire puisque l'instance LibraryFrame sera toujours initialisé à ce point.

Autres conseils

Selon la documentation de cette de classe, il est vraiment destiné à être utilisé par une méthode pour valider ses arguments. (C'est, il est destiné à l'application de la conditions .) Vous devriez passer des tests unitaires pour ComponentFactory, et ils devraient faire valoir que sa méthode getLibraryFrame() statique ne retourne pas null, mais il ne vaut la peine d'affirmer ce au moment de l'exécution.

Eh bien, lorsque vous utilisez la classe Assertion de JUnit, toute méthode là-dedans sont vides, mais il utilise le framework JUnit pour vous dire si le test a échoué ou passe.

Si cette méthode est pour les tests unitaires, alors vous avez accompli votre test, mais si cela ment pour l'exécution, utilisez une si la condition.

Je recommande d'utiliser le initialisation sur demande modèle (c.-à-paresseux chargement singleton) pour votre singleton. Dans ce modèle, si la construction de l'instance que vous n'aurez une exception, sinon vous aurez l'objet.

Ceci améliore votre solution de deux façons: il n'a pas la charge de la synchronisation et il n'a pas la charge de la Assert. Les deux méthodes jettent une exception si l'objet singleton est pas créé - dans votre code, vous obtiendrez un IllegalArgumentException du assert

.

Utilisation init-sur-demande votre code serait:

public class ComponentFactory 
{
  private ComponentFactory() 
  {
  }

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

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

Pour l'utiliser serait encore:

LibraryFrame libraryFrame = ComponentFactory.getLibraryFrame();

... à moins que vous ne avez plus besoin ni le Assert ni le Synchronized.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top