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

Design Patterns Discussion :

[Java] Ne pouvoir instancier une classe qu'une seule fois


Sujet :

Design Patterns

  1. #1
    Membre du Club
    Inscrit en
    Mai 2003
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 62
    Points : 58
    Points
    58
    Par défaut [Java] Ne pouvoir instancier une classe qu'une seule fois
    Je cherche a comprendre comment je pourrais elaborer une classe toute simple qui soit instanciable qu'une seule fois dans mon application.

    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
    package myutils;
    
    public class MakeSerialNumber
    {
    
    //-----------------------------------------------
    
      private int serial;
    
    //-----------------------------------------------
    
      public MakeSerialNumber()
      {
        serial = 1;
      }
    
      //-----------------------------------------------
    
       public String getNewSerialNumber()
       {
         return "SN_" + numero++;
       }
    
      //-----------------------------------------------
    }
    Voila pour la declaration de ma classe.

    Maintenant voici comment je l'utilise dans mon application:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MakeSerialNumber makeserialnumber;
    
    makeserialnumber= new MakeSerialNumber();
    
    System.out.println(makeserialnumber.getNewSerialNumber());
    J'aimerais savoir comment modifier mon code (declaration, appel) pour ne pouvoir instancier qu'un seul objet de la classe MakeSerialNumber;

    Merci par avance.
    "Le plus simple est toujours le meilleur, mais le meilleur n'est pas toujours le plus simple"

  2. #2
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Bonjour,

    Une solution pourrait être un peu comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Test
    {
    	private static Test t = new Test();
    	
    	private Test()
    	{
    	}
    
    	public static Test getInstance()
    	{
    		return t;
    	}
    }
    Je ne garantis pas que ça soit correct conceptuellement parlant, mais ça fonctionne. Ici, au lieu d'appeler ton constructeur, tu appelleras getInstance() qui te renverra toujours la même instance t...

    Cordialement

    Fred
    Développeur Java / Flex à Shanghai, Chine
    mes publications
    Mon dernier tutoriel : Messages Quit IRC : explications

    La rubrique IRC recrute des redacteurs : contactez moi

    Ce flim n'est pas un flim sur le cyclimse. Merci de votre compréhension.[/SIZE]

  3. #3
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Pour info, la variante de mavina, c'est le design pattern singleton

    Mais il faut rajouter une chose, c'est que le constructeur doit être déclaré private pour ne plus pouvoir être appellé d'ailleurs.

  4. #4
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    voilà rajouté

    Fred
    Développeur Java / Flex à Shanghai, Chine
    mes publications
    Mon dernier tutoriel : Messages Quit IRC : explications

    La rubrique IRC recrute des redacteurs : contactez moi

    Ce flim n'est pas un flim sur le cyclimse. Merci de votre compréhension.[/SIZE]

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Et aussi le getter doit être en static sinon il pourra jamais être appelé :-).

  6. #6
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par anoukhan
    Et aussi le getter doit être en static sinon il pourra jamais être appelé :-).
    En effet

    Je l'avais loupé celui,là

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2005
    Messages : 102
    Points : 130
    Points
    130
    Par défaut
    Salut,

    Et synchronized pour éviter que 2 threads appellent en même temps le getInstance la première fois.

    A plus,
    Mathieu

  8. #8
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par M@th
    Salut,

    Et synchronized pour éviter que 2 threads appellent en même temps le getInstance la première fois.

    A plus,
    Mathieu
    Ca dépend

    Dans ce cas-là, c'est pas utile, car t est initialisé dès le début, donc pas de possibilité d'avoir 2 instances. De plus, si l'application n'est pas multi-thread, il ne faut pas synchronisé le code, car ça diminue les performances.

  9. #9
    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 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par wichtounet
    Dans ce cas-là, c'est pas utile, car t est initialisé dès le début, donc pas de possibilité d'avoir 2 instances.
    En effet, les éléments static ne peuvent pas être accéder tant que la classe est complètement chargé par le ClassLoader, donc ce code est totalement thread-safe : http://christophej.developpez.com/tu...n/multithread/

    Il s'agit d'une des solutions les plus simples pour la synchronisation du Singleton (pour plus de détail, voir l'article de ChrispthopeJ sur le sujet : Le Singleton en environnement Multithread).

    Citation Envoyé par wichtounet
    De plus, si l'application n'est pas multi-thread, il ne faut pas synchronisé le code, car ça diminue les performances.
    Une nuance toutefois : sur les JVMs actuelles le cout de la synchronisation en lui même n'est plus si important qu'auparavant...

    a++

  10. #10
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut
    Pourtant l'avantage du "synchronized" sur la méthode "getInstance" est double :
    * il permet de documenter naturellement (sans la javadoc) que cette méthode est thread-safe,
    * il permet de changer le mécanisme d'instanciation sous-jacent (par exemple via Spring) sans impacter l'utilisation du Singleton.
    " Jag blev dömd för fildelning och allt jag fick var en sketen t-shirt. " (tankafritt.nu)
    PAS DE REPONSE PAR MESSAGE PRIVE ! Penser au bouton Résolu en bas de la discussion...

  11. #11
    Membre du Club
    Inscrit en
    Mai 2003
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 62
    Points : 58
    Points
    58
    Par défaut
    Je vous remercie tous pour votre aide qui a largement depasse mes attentes.

    J'ai beaucoup appris en lisant vos messages.

    Voici mon code final :

    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
    public class MakeSerialNumber
    {
      //--------------------------------------------------------------------------
    
      private int numero;
    
      private static MakeSerialNumber makeserialnumber = new MakeSerialNumber();
    
      //--------------------------------------------------------------------------
    
      private MakeSerialNumber()
      {
        numero = 1;
      }
    
      //--------------------------------------------------------------------------
      
      public static MakeSerialNumber getInstance()
      {
              return makeserialnumber;
      }
    
      //--------------------------------------------------------------------------
    
       public String getNewSerialNumber()
       {
         return "CPT_" + numero++;
       }
    
      //--------------------------------------------------------------------------
    }
    Voici comment je l'utilise dans mon application :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MakeSerialNumber makeserialnumber;
    
    String serial = makeserialnumber.getInstance().getNewSerialNumber()
    N'y a-t-il pas plus court pour obtenir un nouveau numero de serie ?
    "Le plus simple est toujours le meilleur, mais le meilleur n'est pas toujours le plus simple"

  12. #12
    Membre confirmé Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Points : 554
    Points
    554
    Par défaut
    Citation Envoyé par Xiao-An
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MakeSerialNumber makeserialnumber;
    
    int serial = makeserialnumber.getInstance().getNewSerialNumber()
    N'y a-t-il pas plus court pour obtenir un nouveau numero de serie ?
    Si, comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int serial = MakeSerialNumber.getInstance().getNewSerialNumber()
    C'est une méthode statique, pas besoin de passer par un objet...

  13. #13
    Membre du Club
    Inscrit en
    Mai 2003
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 62
    Points : 58
    Points
    58
    Par défaut
    Pardon Claythest, j'ai commis une erreur dans mon code.

    La fonction retourne une chaine de charactere et non un entier.

    J'ai deja modifie mon message.
    "Le plus simple est toujours le meilleur, mais le meilleur n'est pas toujours le plus simple"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Instancier un tableau d'une classe dans une autre classe..
    Par Azhenot dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 11/08/2013, 22h34
  2. Réponses: 7
    Dernier message: 11/03/2010, 10h13
  3. Eval d'une propriété d'une classe dans une classe
    Par bizet dans le forum ASP.NET
    Réponses: 4
    Dernier message: 28/10/2008, 09h43
  4. Réponses: 2
    Dernier message: 31/08/2005, 16h12
  5. Réponses: 4
    Dernier message: 17/03/2004, 17h24

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