IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Réinstancier un singleton


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2009
    Messages : 32
    Points : 27
    Points
    27
    Par défaut Réinstancier un singleton
    Bonjour,

    Existe-t-il un moyen de ré-instancier un singleton ?

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : avril 2002
    Messages : 13 938
    Points : 23 015
    Points
    23 015
    Billets dans le blog
    1
    Par défaut
    Salut,


    Si tu cherches à faire cela c'est que tu dois avoir un gros problème : le principe même du singleton c'est justement de ne pas être instancié plusieurs fois !!!


    Détailles ton problème !


    a++

  3. #3
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Citation Envoyé par rocklass Voir le message
    Bonjour,

    Existe-t-il un moyen de ré-instancier un singleton ?

    Merci d'avance.
    Comme l' a dit adiGuba, le principe dernière un singleton c'est d'avoir une seule instance de la classe. On utilise donc un système de cache qui contient une référence de l'objet durant la vie du programme.

    De ce fait, il ne peut y avoir plusieurs instances d'un singleton sinon, cela violerait le principe précédemment annoncé.

    un Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    public class mySingleton
    {
       private mySingleton cache;
     
      private mySingleton()  // pour ne pas être appelé par une autre classe
      {
      }
     
      public static mySingleton getInstance()
      {
         if (cache == null)
            cache = new mySingleton();
     
         return cache;
      }
    }
    Avec ce bout de code, il est donc impossible d'avoir plusieurs instances de cette classe. A moins d'empressement créer ces instances depuis la classe elle-même.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 481
    Points : 48 794
    Points
    48 794
    Par défaut
    ça, c'est l'implémentation naive du singleton à ne pas utiliser

  5. #5
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    ça, c'est l'implémentation naive du singleton à ne pas utiliser
    Alors laquelle devrait-on utiliser ?

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : avril 2002
    Messages : 13 938
    Points : 23 015
    Points
    23 015
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par darrylsite Voir le message
    Alors laquelle devrait-on utiliser ?
    Ceci par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public final class MySingleton {
        private static MySingleton INSTANCE = new MySingleton();
     
        private MySingleton() {
        }
     
        public static MySingleton getInstance() {
            return INSTANCE ;
        }
    }
    Comme cela tu es sûr qu'il n'y aura qu'une seule et unique instance Singleton, car elle sera créé par le Classloader.


    Dans le code que tu donnais, il est possible d'en créer plusieurs si on appelle la méthode getInstance() en même temps depuis plusieurs threads...


    Sinon il y a une solution toute simple qui permet de gérer en plus la Sérialisation de manière propre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public enum MySingleton {
        INSTANCE;
    }


    a++

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2009
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Je vais expliquer mon problème plus en détail. Voici ma classe singleton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    public final class Application
    {
     
      /** instance unique */
      private static final Application APPLICATION = new Application();
     
     
      /** workspace */
      private final Workspace workspace = new Workspace();
     
      static
      {
        // initialisation
        APPLICATION.workspace.init();
      }
     
      /**
       * Constructeur
       */
      private Application()
      {
        // Traitement
      }
     
      /**
       * Retourne une instance unique de l'application 
       * @return application
       */
      public static Application getApplication()
      {
        return APPLICATION;
      }
     
      /**
       * Retourne le workspace 
       * @return workspace
       */
      public Workspace getWorkspace()
      {
        return workspace;
      }
    Cette classe me permet de lancer mon application. C'est un singleton car je veux que mon application Swing ne soit lancée qu'une fois à la fois sur une même JVM.

    Or je souhaite écrire un test JUnit qui lance l'application, la ferme et la relance. Pour cela, je veux détruire l'instance courante de mon application et la lancer une nouvelle fois, de telle sorte que je n'ai toujours qu'une seule instance de mon application.

    Dans le cadre d'une exécution normale de mon application (pas un test), je fais un System.exit(0) pour fermer mon application, mais si je fais la même chose lors d'un test JUnit, ça ferme également le thread JUnit. C'est pour cela que je souhaite procéder autrement en détruisant l'instance de mon application et en le re-créant.

    Quelle est la meilleure solution pour résoudre mon problème ?

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 481
    Points : 48 794
    Points
    48 794
    Par défaut
    je vois trois possibilités:

    1) modifier le singleton pour obtenir sa collaboration (byebye final, ajout d'une méthode protégée reset(), etc)
    2) utiliser à fond les apis reflection pour violenter méchamment le singleton (bof bof mais jouable)
    3) utiliserdes framework comme powermock jmockup, mockito ou autre, certain d'entre eux permettent de jouer sur les singletons.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2009
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    je vois trois possibilités:

    1) modifier le singleton pour obtenir sa collaboration (byebye final, ajout d'une méthode protégée reset(), etc)
    2) utiliser à fond les apis reflection pour violenter méchamment le singleton (bof bof mais jouable)
    3) utiliserdes framework comme powermock jmockup, mockito ou autre, certain d'entre eux permettent de jouer sur les singletons.
    Je partirai bien sur la première solution mais je ne vois pas comment implémenter ce fameux reset.

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 481
    Points : 48 794
    Points
    48 794
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    public final class Application
    {
     
      /** instance unique */
      private static Application APPLICATION = new Application();
     
     
      /** workspace */
      private final Workspace workspace = new Workspace();
     
     
      /**
       * Constructeur
       */
      private Application()
      {
        workspace.init();
      }
     
      /**
       * Retourne une instance unique de l'application 
       * @return application
       */
      public static Application getApplication()
      {
        return APPLICATION;
      }
     
    protected static void resetSingleton(){
    APPLICATION  = new Application();
    }
     
      /**
       * Retourne le workspace 
       * @return workspace
       */
      public Workspace getWorkspace()
      {
        return workspace;
      }

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/03/2008, 11h58
  2. Singleton héritable ?
    Par rolkA dans le forum C++
    Réponses: 10
    Dernier message: 11/12/2004, 17h22
  3. [Débutant] pattern singleton
    Par SirDarken dans le forum Débuter avec Java
    Réponses: 22
    Dernier message: 11/12/2004, 02h55
  4. Mutiple row in singleton select ????? [Important, merci]
    Par SkyDev dans le forum Bases de données
    Réponses: 6
    Dernier message: 20/04/2004, 15h02
  5. [debutant]Singleton
    Par bafman dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/01/2004, 16h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo