6
votes

Comment faire un singleton immuable en Java?

Un objet immuable est initialisé par sa consommation uniquement, tandis qu'un singleton est instancié par une méthode statique. Comment faire un singleton immuable en Java?


0 commentaires

4 Réponses :


9
votes

pendant qu'un singleton est instancié par un Méthode statique p>

Bien que c'est la façon habituelle de le faire, cela ne signifie pas que le seul moyen. P>

en Java 1.5 Une nouvelle version de Singleton est le modèle Enum Singleton: P>

public enum Elvis{

INSTANCE // this is a singleton, no static methods involved

}

5 commentaires

Cet exemple provient de Java efficace, je présume ;-)


@darioo: Oui, mais il manque le Leavethebuilding () méthode :-)


Au fait, Singleton a-t-il cassé un principe de OOP?


@wang Certains disent oui, car il introduit l'état mondial. Lire l'article Wikipedia: en.wikipedia.org/wiki/singleton_pattern


En fait, dans le premier cas, la portée n'est pas Java VM , mais le chargeur de classe. Si vous chargez à nouveau la même classe avec un autre chargeur de classe, il peut avoir son propre singleton.



1
votes
public enum MySingleton {
instance;
//methods
}

//usage
MySingleton.instance.someMethod();

0 commentaires

5
votes

La solution pointée par Sean est un bon moyen d'initialiser les singletons si em> leur création n'est pas chère. Si vous souhaitez "charger des paresseux", examinez l'initialisation sur le titulaire de la demande Idiom.

 // from wikipedia entry
 public class Singleton {

   // Private constructor prevents instantiation from other classes
   private Singleton() {
   }

   /**
    * SingletonHolder is loaded on the first execution of Singleton.getInstance() 
    * or the first access to SingletonHolder.INSTANCE, not before.
    */
   private static class SingletonHolder { 
     public static final Singleton INSTANCE = new Singleton();
   }

   public static Singleton getInstance() {
     return SingletonHolder.INSTANCE;
   }

 }


2 commentaires

Yup, c'est celui que j'ai appelé "motif d'initialisation-statique-statique-classe" :-) +1


@San: Oh, je n'ai pas réalisé que vous parliez de la même chose. Je suppose que votre réponse était en effet complète. +1 :)



1
votes

Vous êtes inutile compliqué. Pour être immuable, un objet doit être non modifiable une fois qu'il est créé. C'est normalement interprété pour signifier «modifiable uniquement dans le constructeur», mais si vous deviez le créer une autre façon qui le rendrait toujours immuable. Tant que votre objet ne peut pas être modifié après son initialisation, il est immuable. Vous pouvez envisager de configurer l'instance Singleton pour faire partie de l'initialisation.

La plupart des avantages de l'immutabilité ne sont pas pertinents dans les singletons.


0 commentaires