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] question sur variable static


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Juillet 2003
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 46
    Par défaut [Singleton] question sur variable static
    Bonjour,
    j'ai créé un singleton en définissant également des variables A et B.

    par commodité je les ai déclaré en static au lieu de définir des getter/setter.

    cependant en lançant findBugs il me donne ce code erreur
    ST: Write to static field from instance method (ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD)

    This instance method writes to a static field. This is tricky to get correct if multiple instances are being manipulated, and generally bad practice.
    voici le code de mon 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
     
    public class XSingleton {
            private static XSingleton _singleton;
    	private static XSearcher _searcher;
    	private static XReader _reader;
     
           private XSingleton() {
    		super();
    	}
     
    	public static final XSingleton getInstance()
    	{
    		return _singleton;
    	}
     
            static final void initialize(XSearcher indexSearcher, XReader   indexReader)
    	{
    		_singleton = new XSingleton();
    		_searcher = indexSearcher;
    		_reader = indexReader;
    	}
     
    ....
    }
    Ma question: quelle est le best practice pour les singletons vis a vis de ces attributs?

    dois je enlever le mot clé static devant la définition de _searcher et de _reader et dois je déclarer à la place des getter/setter?
    ou alors je ne tiens pas compte de findBugs pour ce cas

    merci d'avance

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par ultimax Voir le message
    par commodité je les ai déclaré en static au lieu de définir des getter/setter.
    Ils sont private, donc inaccessible depuis l'extérieur.
    L'instance unique est gérée par le singleton, donc inutile de mettre static ces données membres.
    De plus, ton code est bancal. Si quelqu'un appelle une seconde fois la méthode d'initialisation, ton singleton change pour tout le monde.
    La création du singleton doit se faire soit à la déclaration de la données, soit dans la méthode getInstance.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre actif
    Inscrit en
    Juillet 2003
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 46
    Par défaut
    Merci de ta réponse rapide.

    pour info la méthode initialise est appelé une fois au démarrage de l'application.

    mais effectivement rien n'empêche un dév de la rappeler dans son code.

    le souci est que si j'enlève le mot clé static, je ne peux plus utiliser la fonction initialise. ou alors il faut que je change ma façon de faire.

    appelé mon instance de singleton et seulement après mon initialise. comme cela je n'aurais plus a définir initialise en static et donc par la même occasion mes autre objets

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2007
    Messages : 140
    Par défaut
    Voici 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
    18
    19
    20
    21
    22
    23
    24
    25
    public class Singleton {
     
       protected Singleton() {
         // ...
       }
     
     
       /**
        * A handle to the unique Singleton instance.
        */
       static private Singleton _instance = null;
     
       /**
        * @return The unique instance of this class.
        */
       static public Singleton instance() {
          if(null == _instance) {
             _instance = new Singleton();
          }
          return _instance;
       }
     
     
       /. ...additional methods omitted...
    }

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    Faudra initialiser les autres variables non static dans ton constructeur privé .

  6. #6
    Membre actif
    Inscrit en
    Juillet 2003
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 46
    Par défaut
    merci pour vos réponses.

    je vais partir sur une définition classique de singleton,
    et appeler ensuite l'initialisation de mes objets.


  7. #7
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Tu peux faire ça :
    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
    public class XSingleton
    {
      private static XSingleton _singleton = null;
      private XSearcher _searcher;
      private XReader _reader;
     
      private XSingleton( XSearcher s, XReader r )
      {
        _searcher = s;
        _reader = r;
      }
     
      public static final XSingleton getInstance()
      {
        if( _singleton == null )
        {
          ... gérer exception de nullité... ou pas...
        }
        return _singleton;
      }
     
      public static final synchronized XSingleton getInstance( XSearcher s, XReader r )
      {
        if( _singleton == null )
        {
          _singleton = new XSingleton( s, r );
        }
        return _singleton;
      }
     
    ....
    }
    Si tu veux malgré tout construire le singleton dans la méthode "getInstance" sans argument, n'oublie pas de la synchroniser.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

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

Discussions similaires

  1. Question sur Variable debutant.
    Par Pif_Paf_Pouf dans le forum Android
    Réponses: 9
    Dernier message: 17/06/2014, 22h38
  2. Questions sur variables
    Par JCMANSION dans le forum Android
    Réponses: 2
    Dernier message: 17/12/2010, 10h23
  3. Question sur variables & Recordset
    Par Jordmund dans le forum VBA Access
    Réponses: 9
    Dernier message: 20/06/2007, 14h41
  4. [C#] Question sur variable "protected"
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 11
    Dernier message: 22/06/2006, 15h12
  5. Question sur les statics et les structures
    Par Steph12 dans le forum C
    Réponses: 3
    Dernier message: 24/03/2005, 13h20

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