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

Langage Java Discussion :

Singleton constructeur avec paramètres


Sujet :

Langage Java

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 165
    Points : 137
    Points
    137
    Par défaut Singleton constructeur avec paramètres
    Bonjour,

    Peut on passer des paramètres dans un 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
        private BLL(String Path) {
            PATH= Path;
        }
     
        private BLL() {
        }
     
         public static BLL getInstance() {
             if (INSTANCE == null){
                 synchronized(BLL.class){             
                         INSTANCE = new BLL();
                     }
             }
             return INSTANCE;
         }
     
         public static BLL getInstance(String Path) {
             if (INSTANCE == null){
                 synchronized(BLL.class){             
                         INSTANCE = new BLL(Path);
                     }
             }
             return INSTANCE;
         }
    ou préférez vous une methode Set qui va initialiser mes attributs sans faire de passage de parametre dans le constructur ?

  2. #2
    Membre habitué
    Profil pro
    Développeur Java
    Inscrit en
    Juin 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2009
    Messages : 102
    Points : 172
    Points
    172
    Par défaut
    J'aurais pour ma part tendance à dire ni l'un, ni l'autre...

    Dans un cas, dans ton exemple de code, le passage de paramètre ne fonctionnera qu'une seule fois, à l'initialisation. Tu vas me dire, c'est exactement le fonctionnement souhaité... Ce qui est génant, c'est quand même que si quelqu'un fait un autre appel avec un autre paramètre, ça ne marchera pas (comme c'est un singleton, il n'a aucun moyen de savoir si ça a déjà été instancié ou pas)

    Et faire un Set à un singleton, c'est aussi dangereux parce que le set impacte tout le monde...

    Moi j'aurais tendance à dire pour éviter toute ambiguité, de ne laisser qu'une seule méthode et de supprimer le getInstance sans paramètre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
         public static BLL getInstance(String Path) {
             if (INSTANCE == null){
                 synchronized(BLL.class){             
                         INSTANCE = new BLL();
                     }
             }
             INSTANCE.setPath(Path);
             return INSTANCE;
         }
    Mais quand même, pas très pratique pour un singleton...

  3. #3
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Points : 340
    Points
    340
    Par défaut
    Ca me semble également une mauvaise idée. De tout évidence ton singleton doit lire un fichier, tu peux donc mettre le chemin dans un fichier de conf par exemple.
    Au passage ton synchronised est mal placé et ne sert ici à rien

  4. #4
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 165
    Points : 137
    Points
    137
    Par défaut
    Oui mes chemins aux fichiers sont dans un conf.properties. Mais c'est la class Main qui ouvre et lit les conf
    bien ou pas bien

    Je développe en couche : BLL DAL
    On m'a demandé de faire des Singletons
    Le Main instancie la BLL et la BLL instancie la DAL...

    mon synchronised est plassé comme dans un tutorel de Singletons

  5. #5
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Points : 340
    Points
    340
    Par défaut
    Pour le problème de synchronised, si deux thread appelle getInstance() alors qu'il est encore null, il est possible qu'il rentre tous les deux dans le bloc "if (instance == null)".
    Pour empêcher ca soit tu rajoutes un synchronised autour du bloc if, (ce qui est du double check locking ou un nom approchant) sachant que cette solution comporte un risque (très faible mais existant quand même) de ne pas marcher (à cause de la gestion du cache par Java, je te renvoie vers un article parlant du problème de singleton sur le site ).
    La solution la plus sécurisée (mais la plus couteuse) est de synchroniser toute la fonction.

    Sinon pour les fichiers de conf, j'ai pour habitude d'utiliser un singleton pour le lire justement Je ne sais pas si c'est la facon la plus propre, mais elle a l'intérêt de me permettre d'accéder au propriété du fichier plus facilement.

  6. #6
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 165
    Points : 137
    Points
    137
    Par défaut
    Citation Envoyé par Djobird Voir le message
    Pour le problème de synchronised, si deux thread appelle getInstance() alors qu'il est encore null, il est possible qu'il rentre tous les deux dans le bloc "if (instance == null)".
    Pour empêcher ca soit tu rajoutes un synchronised autour du bloc if, (ce qui est du double check locking ou un nom approchant) sachant que cette solution comporte un risque (très faible mais existant quand même) de ne pas marcher (à cause de la gestion du cache par Java, je te renvoie vers un article parlant du problème de singleton sur le site ).
    La solution la plus sécurisée (mais la plus couteuse) est de synchroniser toute la fonction.
    .
    Javais mal lu le tuto
    Je vais opter pour une solution coûteuse.

    Citation Envoyé par Djobird Voir le message
    Sinon pour les fichiers de conf, j'ai pour habitude d'utiliser un singleton pour le lire justement Je ne sais pas si c'est la facon la plus propre, mais elle a l'intérêt de me permettre d'accéder au propriété du fichier plus facilement.
    Ah oui, allez un singleton de plus


    Merci

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

Discussions similaires

  1. question sur constructeur avec paramètre
    Par Invité dans le forum Débuter
    Réponses: 3
    Dernier message: 15/11/2010, 11h31
  2. [C#]Constructeur avec paramètre dans designer
    Par ClaudeBg dans le forum Windows Forms
    Réponses: 1
    Dernier message: 15/02/2009, 19h18
  3. [PHP 5.2] [POO] Constructeur avec paramètres et héritage
    Par yamayo dans le forum Langage
    Réponses: 4
    Dernier message: 11/01/2009, 20h40
  4. [Framework] [Core] bean et constructeur avec paramètre
    Par robert_trudel dans le forum Spring
    Réponses: 3
    Dernier message: 10/07/2008, 13h52
  5. [EJB Session] Constructeur avec paramètres ?
    Par DevTeam_ dans le forum Java EE
    Réponses: 23
    Dernier message: 07/05/2008, 12h07

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