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 :

Static et Singleton


Sujet :

Design Patterns

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 30
    Points : 31
    Points
    31
    Par défaut Static et Singleton
    Bonjour,

    Une pensée "philosophico-programmeuse" me traverse l'esprit depuis ce matin .

    Une variable statique est une variable de classe ce qui veut dire que tous les objets de cette classe référence la même variable.

    Un singleton permet de n'avoir qu'un seul objet d'une classe.

    Ma question est donc : "Une variable statique a t-elle un rôle justifié dans une singleton" ?

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    oui d'ailleurs c'est toujours comme cela que je l'ai vu implémenté.

    Version ultra-light

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Singleton
    {
        static Singleton singleton = new Singleton();
    
       static Singleton getInstance() 
       {
             return singleton;
       }
    }
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 30
    Points : 31
    Points
    31
    Par défaut
    Ma question était portée bien évidemment sur les autres variables éventuelles qu'il pourrait y avoir dans la classe.

    Y a-t-il un cas où une variable statique aurait un intérêt dans un singleton puisque par définition il n'y aura qu'un seul objet de cette classe ?

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par ecplusplus Voir le message
    Y a-t-il un cas où une variable statique aurait un intérêt dans un singleton puisque par définition il n'y aura qu'un seul objet de cette classe ?
    J'ai du mal à te suivre. Tu remarqueras que la méthode pour accéder à l'objet est statique donc tu ne peux qu'utiliser des membres statiques dedans.

    Aussi il existe plusieurs variantes d'implémentation de ce pattern et de façon de l'utiliser correctement.

    Cas d'école

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Singleton
    {
        static Singleton singleton = new Singleton();
        static int compteurAppel = 0;
    
       static Singleton getInstance() 
       {
            compteurAppel++;
             return singleton;
       }
    }
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  5. #5
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    J'ai du mal à te suivre. Tu remarqueras que la méthode pour accéder à l'objet est statique donc tu ne peux qu'utiliser des membres statiques dedans.
    Précision : dans la méthode getInstance oui, mais pas forcément dans les méthodes de l'instance.
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par Patriarch24 Voir le message
    Précision : dans la méthode getInstance oui, mais pas forcément dans les méthodes de l'instance.
    Cela s'applique à toutes les méthodes statiques donc même celle de l'instance.

    J'avoue ne pas trop savoir ou elle veut en venir avec cette histoire d'interet des variables statiques, on peut les utiliser pour les constantes aussi donc oui il y a un interet
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 30
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par hegros Voir le message
    J'avoue ne pas trop savoir ou elle veut en venir...
    Non non, c'est IL !

    Je vais essayer d'être plus clair.

    Qu'est-ce qu'un singleton ? C'est une classe qui n'aura qu'une seule instance.
    Qu'est-ce qu'une variable statique ? C'est une variable qui n'est pas rattachée à l'OBJET, mais à la CLASSE !!! Donc il n'y aura qu'UNE SEULE variable statique pour tous les objets instanciés.

    Ma question est donc de trouver un intérêt à mettre une variable statique dans un singleton (autre que celle qui sont là pour créer le singleton), puisque de toutes façons il ne peut y avoir qu'UN SEUL OBJET de la classe !!!

    Donc maintenant est-ce que quelqu'un voit un intérêt quelconque ? Je suis intéressé par une vraie réponse et non le fait de me faire agresser.

    Merci

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    Salut,

    Dans un cas general, la reponse a ta question est non.
    A part le statique de l'instance, il n'y a pas besoin de declarer d'autres variable statique.
    De part la nature du singleton toutes les variables seront partagées par tous les objects accedant au singleton, le STATIQUE deviendrait donc redondant.

    Le seul cas que je pourrais imaginer c'est si tu veux definir des constantes (static final) dans le singleton au lieu de les definir dans des interfaces.

    Maintenant toutes les situations ne se resolvent pas de manieres unique.
    Donc si tu as un cas concret montre le nous.

    ---
    Farid.

  9. #9
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    J'ai du mal à comprendre où tu veux en venir.

    Pour essayer d'y voir plus clair, j'ai une question pour toi : à quel autre moyen penses-tu pour implémenter un singleton ?
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 255
    Points : 99
    Points
    99
    Par défaut
    Peut-être que la question sous-jacente est :

    quel est l'intérêt du Singleton

    par rapport à

    une implémentation "tout statique" qui garanti déjà que tout ne sera présent qu'en un seul exemplaire au niveau de la classe elle-même.

    Un élément de réponse, extrait du chapitre "Singleton" très bon livre "Tête la première - Design Patterns".

    Question: Est-ce que je ne peux pas me contenter de créer une classe dont toutes les méthodes et les variables sont statiques ? Ne serait-ce pas identique à un Singleton ?

    Réponse: Oui, si votre classe est autonome et ne dépend pas d'une initialisation complexe. Toutefois, en raison de la façon dont Java gère les initialisations statiques, cela peut donner un vrai gâchis, surtout si plusieurs classes sont impliquées. Ce scénario aboutit souvent à des bogues subtils et difficiles à détecter, qui sont liés à l'ordre des initialisations. A moins qu'il n'y ait une raison impérative d'implémenter votre "singleton" de cette façon, il est de beaucoup préférable de rester dans le monde objet.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 30
    Points : 31
    Points
    31
    Par défaut
    J'ai été un peu absent ses temps-ci donc désolé de la réponse tardive.
    En tout cas je vous remercie, vous m'avez donné les réponses que je voulais.

    J'ai un collègue qui avait Design Pattern de la collection Tête la première, et il avait vraiment l'air bien fait. J'ai pour ma part celui du "GOF" : "Elements of reusable object-Oriented Software" qui est malheureusement en anglais et je dois dire que je ne suis pas super à l'aise avec l'anglais.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Points : 24
    Points
    24
    Par défaut
    Bonjour ecplusplus,

    Concernant ta question initiale:

    Ben oui pourquoi pas une ou plusieurs autres static, dans une classe singleton!

    Exemple: si (pour une raison ou pour une autre...) je veux compter le nombre
    d'appel à la méthode getInstance() de cette classe.

    Mais on pourrait me répondre : "ben dans ce cas pourquoi ne pas mettre ça DIRECTEMENT dans un membre (non static) de l'instance(unique donc)?"

    Cette remarque se tient , cependant: il ne faut pas mélanger ce qui est du ressort de la classe et ce qui est du ressort des objets (ici un seul donc)
    ayant pour type cette classe.
    Une propriété de classe (static donc) N'EST PAS une propriété d'instance (même unique) de cette classe. C'est juste une question de principe, de rigueur et d'évolutivité. Ces 2 notions (static / non-static) existent et chacune à son rôle... (ce n'est pas pour des prunes... :o)).

    D'ailleurs si un jour la classe n'est plus singleton (pour une raison ou une autre...) il faudra faire la part des choses entre propriétés de la classe elle-même et propriétés de ses instances... alors autant le faire dés maintenant pour éviter les confusions futures et les pertes de temps pour réorganiser proprement les codes clients de cette classe, si elle devient en effet un jour NON singleton.

    La distinction doit être bien maintenue à mon sens... pour toutes ces raisons, au moins.

    Espérant répondre à ton interrogation.
    Modeste développeur: je suis là pour apprendre et si je peux aider ça me fait plaisir aussi.

    Favoriser l'extensibilité du code à sa "modifiabilité".
    --> VIVE LES INTERFACES.

    Je hais les copier-coller(sources d'erreurs , d'oublis, de doublonnage, de code mort,...) et suis pour la réUTILISABILITE.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Points : 24
    Points
    24
    Par défaut
    Au fait , concernant le livre "DP tête la première", je l'ai lu de bout en bout,
    il peut vraiment être très enrichissant, même s'il n'est pas parfait non plus.
    En tout cas ça m'a éclairé et appris sur beaucoup de points.
    ;o)
    Modeste développeur: je suis là pour apprendre et si je peux aider ça me fait plaisir aussi.

    Favoriser l'extensibilité du code à sa "modifiabilité".
    --> VIVE LES INTERFACES.

    Je hais les copier-coller(sources d'erreurs , d'oublis, de doublonnage, de code mort,...) et suis pour la réUTILISABILITE.

  14. #14
    Membre habitué
    Profil pro
    Enculeur de mouches
    Inscrit en
    Septembre 2003
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Enculeur de mouches

    Informations forums :
    Inscription : Septembre 2003
    Messages : 133
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par hegros Voir le message
    Aussi il existe plusieurs variantes d'implémentation de ce pattern et de façon de l'utiliser correctement.

    Cas d'école
    Ton exemple peut très bien se coder :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Singleton
    {
        static Singleton singleton = new Singleton();
        int compteurAppel = 0;
    
       static Singleton getInstance() 
       {
            this->singleton.compteurAppel++;
             return singleton;
       }
    }
    Néanmoins c'est moins rapide (pardon, efficace).

    Bon après, même si c'est pas super propre, j'ai vu des singletons qui se mexait avec des classes utilitaires : leur rôle central dans l'appli était assez logique pour qu'il référence les principaux objets et présente quelques méthodes utilitaires. Disons que la conception n'était pas super rigoureuse vis-à-vis des D.P. mais néanmoins les déveurs s'y retrouvaient.
    Dans ce genre de cas, il est assez tentant de rajouter quelques attributs statiques pour assurer le fonctionnement des méthodes.

    Mais la réponse stricte à ta question est non, aucun besoin, la preuve est l'exemple de code en début de post.
    Gaïa n'est pas une marchandise.

Discussions similaires

  1. classe Static ou singleton ?
    Par phoeniix07 dans le forum Langage
    Réponses: 39
    Dernier message: 11/02/2008, 18h02
  2. Singleton ou static
    Par yannick1717 dans le forum Général Java
    Réponses: 10
    Dernier message: 29/01/2008, 18h02
  3. methode static Vs singleton
    Par BigNic dans le forum C++
    Réponses: 4
    Dernier message: 22/02/2007, 10h19
  4. [Language][Static vs Singleton] Précisions
    Par vincent63 dans le forum Langage
    Réponses: 6
    Dernier message: 14/11/2005, 17h00
  5. singleton et static
    Par elekis dans le forum C++
    Réponses: 2
    Dernier message: 10/09/2005, 16h11

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