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

API standards et tierces Java Discussion :

avoir qu'un seul instance d'un object


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 61
    Par défaut avoir qu'un seul instance d'un object
    Bonjour,
    Je voudrais savoir comment on peut avoir qu'un seul instance d'un objet. Je m'explique, si j'ai une classe A et plusieurs autres classes (B, C). Les méthodes de B et C ont besoin de travailler avec un instance de la classe A. La classe A contient des différentes structures de données et donc les méthodes des classes B et C, elles écrivent et lisent dans ces structures de données. Alors il faut avoir qu'un seul instance de la classe A qui évolue au fur à mesure selon l'application des méthodes des classes B et C.
    Au niveau de l'instanciation de la classe A, cela doit se faire la première fois où une des méthodes des classes B ou C ont besoin de travailler avec l'instance de la classe A.

    J'espère avoir été claire.
    Merci de m'expliquer comment instancier la classe A et assurer qu'il en aura qu'un seul instance et donc les méthodes de B et C peuvent travailler avec.

    Merci bien.

  2. #2
    Membre émérite
    Avatar de LinkinSelim
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Mars 2006
    Messages : 365
    Par défaut
    Bonjour,

    Utilise le design pattern Singleton

    Tu aura pour ton 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
     
    public class A  {
    //métier de A
     
    private static A instance = new A();
     
    public static A getInstance() {
         return instance;   //méthode pour recuperer la seule instance
    }
     
        private A() {
            //constructeur
        }
     
    }
    Comme ça pour avoir l'unique instance de classe A, tu devra appeler la méthode statique A.getInstance(). Tu remarque que Le constructeur est private ce qui veut dire qu'il ne peut pa être l'appeler en dehors de la classe.

    Bonne chance.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 61
    Par défaut
    Merci bien.
    Juste une question, si je voudrais sérialiser la classe A et que quand une méthode de B a besoin de l'instance de A, elle doit vérifier si l'instance A est chargé depuis le disque ou sinon le desérialiser d'abord et l'envoyer....

    cela (sérialisation, vérification et désérialisation) se fait dans la classe A ? et à quel niveau ?
    Merci.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par hassanJava Voir le message
    cela (sérialisation, vérification et désérialisation) se fait dans la classe A ? et à quel niveau ?
    Merci.
    au niveau de getInstance():
    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
     
     
    private static volatile A instance;
     
    public static A getInstance() {
         if (instance==null)
              createInstance();
         return instance;   //méthode pour recuperer la seule instance
    }
    private static synchronized void createInstance(){
        if (instance!=null)
            return;
        // Trouver le fichier sur le disque
        if (trouveSurLeDisque)
            // deserialiser
        else
           instance=new A();
    }
     
        private A() {
            //constructeur
        }
     
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 61
    Par défaut
    Merci à tous.
    Maintenant c'est plus claire pour moi. Pourtant je me pose la question suivante:

    Supposons A est un singleton et son fameux attribut static s'appelle "insOfA" et qu'elle a aussi un attribut List.

    Dans la classe B, j'aimerais écrire dans cette list. Je ferais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public A AB = A.getInstance();
    AB.List.add("blabla");
    Alors, comme cela, si dans la classe C, je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public A AC = A.getInstance();
    AC.List.add("blabla2");
    Est-ce que cela ne veut pas dire que j'ai deux instances AB et AC qui font référencer à un instance unique de A ?
    Et par exemple, si j'appelle cette liste plus tard dans une autre classe "D"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public A AD  = A.getInstance();
    print(AD.List);
    elle doit contenir "blabla" et "blabla2".

    Est-ce que c'est ainsi qu'on doit appeler l'instance d'un singleton dans différentes classes ?

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    oui c'est l'idée. Deux remarque cependant:

    On ne commence pas un nom d'attribut, de champ, de propriété ou de variable par une majuscule en java (convention), on commence par une minuscule.

    On évite les attributs public, on préfère utiliser un getter et, éventuellement, un setter.

    Ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public A ab = A.getInstance();
    ab.getList().add("blabla");
     
    public A ac = A.getInstance();
    ac.getList().add("blabla2");
     
    public A ad  = A.getInstance();
    print(ad.getList());

  7. #7
    Membre chevronné Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Par défaut
    Oui c'ets ça.

    Comme en mathématique, un singleton est unique. Cela est garanti par le fait que le constructeur de la classe soit privé (elle est seule à pouvoir se construire.. oui, c'ets un peu déroutant cette redondance au début..).

    Ainsi, au premier appel à getInstance(), l'instance statique va être construite et renvoyer. Puis, pour les autres appels, c'est de nouveau cette instance qui sera renvoyée.

    Dans ton exemple, tu vas effectivement travailler à 3 endroits différents avec la même instance. C'est très pratique pour des manager de ressources, connections etc...

    Il faut voir cette instance comme une variable globale (je sais que certaines personnes considèrent cette variable comme globale).

  8. #8
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    complément de réponse sur le singleton:

    les codes B et C savent-ils qu'il n'existe qu'une instance de A?
    si oui: on peut aussi faire un enum

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    enum UnA {
        A ;
      // champs , 
      // méthodes
      // constructeur
    }
    si non: on peut faire un mandataire sur le singleton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class MandataireA {
       private static A singleton = A.getInstance() ;
      // ou classe interne initialisée
     
      public Truc methode(Machin machin) {
               return singleton.methode(machin) ;
      }
     
    }
    Citation Envoyé par hassanJava Voir le message
    cela (sérialisation, vérification et désérialisation) se fait dans la classe A ? et à quel niveau ?
    Dans la mesure où nos singletons s'appuient sur des codes statiques pourquoi ne pas dire ceci: ces codes ont besoin de données qui seront chargées pendant la période d'initialisation de la classe (donc au premier appel par B ou C en principe -sauf si ... bon passons).

Discussions similaires

  1. avoir une seule instance d'une application sur un reseau
    Par pirbd dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 28/01/2010, 19h05
  2. avoir une seule instance de l'application
    Par doderic dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 25/10/2008, 11h38
  3. Réponses: 11
    Dernier message: 06/12/2005, 08h23
  4. [JUnit] Avoir une seule instance
    Par hocinema dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 25/10/2005, 15h48

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