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

Java Discussion :

Méthodes static vs classe Singleton


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    919
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 919
    Par défaut Méthodes static vs classe Singleton
    Bonjour,

    J'écris une petite application type FatClient. J'ai besoin de garder au niveau central certaines méthodes (obtention connexion à la db, traduction des libellés, config utilisateur, ...).
    Quelle est la meilleure manière de procéder ?
    Une classe singleton qui possède toutes ces méthodes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyApp.getInstance().translate("LIBELLE")
    ou des méthodes static et des variables static ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyApp.translate("LIBELLE")
    Quelle est la manière la plus propre de travailler ?

    Merci,

  2. #2
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2010
    Messages : 119
    Par défaut
    Je pencherais pour la solution utilisant le Singleton, plus flexible, plus "objet", donc selon moi, plus propre.

    Question performance, je ne sais pas laquelle est la meilleure.

  3. #3
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Bonjour,

    Je pencherais aussi pour le Singleton pour les mêmes raisons.
    Cependant, s'il s'agit de constantes, tu peux aussi faire une classe abstraite avec des variables statiques.
    Après il y a plusieurs écoles...

  4. #4
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    Ces deux méthodes sont assez mauvaises et présentent le même inconvénient, soit l'introduction de dépendances qui rend un code hypersensible au contexte et intestable.

    La meilleure solution dans ces cas là, c'est de fournir ces informations à la classe dont tu as besoin :

    par 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
     
    public class Xxxx
    {
           private Traducteur trad;
     
           public Xxxx(Traducteur trad)
          {
             this.trad = trad
           }
     
     
           public void print()
           {
                 String hello = trad.translate("bonjour");
                 println(hello);
            }
    }

    Comme ça, tu sais que ta classe, pour fonctionner à besoin d'une objet de traduction.
    Et dans l'autre cas que tu as cité, c'est à dire la configuration utilisateur, tu as l'énorme avantage de pouvoir, à l'aide des tests unitaires ou d'un simple main(), tester facilement différentes configuration. Il te suffit de fabriquer de toute pièce un objet configuration et de le fournir à la classe et observer ce qui se passe.

    Bref, c'est plus propre, plus testable et plus clair à la relecture.

  5. #5
    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
    Je rajouterais même: vous emmerdez pas à utiliser un objet "Traducteur", utilisez directement un objet "Ressourcebundle"

  6. #6
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    919
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 919
    Par défaut
    Merci pour les réponses.
    @_skip et tchize_: en effet si je n'avais que les traductions, c'est que je ferais, mais j'ai ici une dizaine de propriétés générale de l'application que je veux pouvoir récupérer à peu prêt partout sans devoir les passer dans chaque classe.
    Car les mettre dans chaque classe, ça m'oblige à les sérializer quand je les sérialize, ou si je les mets en transient elles manquent à la désérilisation !

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    En même temps les objets qui utilisent ce genre de choses n'ont pas à être sérialisés. La sérialisation c'est pour les données, c'est pas pour simuler un dump de la mémoire du programme.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    919
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 919
    Par défaut
    Bon c'est ma 1ère application avec une DB. Donc je ne l'ai probablement pas écrite idéalement.
    Au niveau de mon application, j'ai un objet connexion qui permet a tout un chacun de faire ses update, select, insert, ...

    Auparavant, je passais cette connexion dans tous mes objets db, mes objets gui (devant déclencher de nouvelles interactions db) et tout-partout. Ca marchait presque nickel (ça ne marche pas que je veux sérializer un objet db pour le sauver dans fichier de préférence par exemple). Donc je viens de supprimer ce mécanisme et je mets cette connexion à disposition de qui veut s'en servir au niveau d'une classe static de l'application. D'où ma question: est-ce que je mets cette connexion à disposition via un Singleton ou via des méthode statique ?

    J'ai pour le moment opté pour le Singleton, mais passer vers des méthodes statiques ne serait rien comparé au refactoring que je viens de me taper !

  9. #9
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Dans son cas on en est assez loin ...
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  10. #10
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    919
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 919
    Par défaut
    Conclusion: Singleton et bien veiller à tout ré-initialiser convenablement entre chaque test JUnit ?

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/11/2011, 16h57
  2. Appel d'une méthode static d'une autre classe
    Par Mooneer dans le forum Langage
    Réponses: 2
    Dernier message: 30/01/2008, 19h05
  3. Réponses: 9
    Dernier message: 12/04/2007, 17h08
  4. Réponses: 6
    Dernier message: 27/07/2005, 09h06
  5. [FLASH MX2004] [AS2] Classe méthodes static
    Par bolo dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 16/12/2004, 18h26

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