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 :

Attribut static héritage


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Attribut static héritage
    Bonjour,

    Je suis confronté à un problème de conception.
    Pour faire simple, je souhaite utiliser le patron de conception singleton pour modéliser XX classes.
    Ainsi dans ce pattern, toutes les classes ont un attribut static (instance), un constructeur privé et une methode getInstance().

    Je me demandais s'il serait possible de faire une sorte d'héritage pour ne pas devoir réécrire tout ses elements XX fois dans chacune de mes classes. Le problème de l'héritage c'est que rien que l'attribut static sera commun a chacune de mes classes.
    Alors qu'il faudrait qu'il soit commun a chacune des instances de classes filles dans un contexte indépendant les unes des autres.

    Je ne sais pas si je suis compréhensible :/

    Existe-t'il un moyen de le faire en Java ?
    Merci

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Nope. Tout ce qui est statique et spécifique à une classe, doit apparaître dans cette classe.

    Tu pourrais t'en sortir en évitant d'appeler des méthodes statiques pour chaque, mais une méthode centralisée, genre remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaClasse ma = MaClasse.getInstance();
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaClasse ma = singletons.get(MaClasse.class);
    La manière dont l'objet singletons s'y prend pour avoir les singletons, dépend si tu fais du lazy-loading ou un chargement au démarrage. Malheureusement le lazy-loading imposerait un coût de synchronisation systématique, et le chargement au démarrage impose quasi-certainement de faire quelque part la liste des classes à charger.
    Mais dans les deux cas, il y a moyen d'utiliser l'introspection pour éviter de copier/coller les mêmes codes dans toutes les classes.

    ... Sinon il y a aussi la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaClasse ma = singletons.getMaClasse();
    Pour chaque classe à singleton, ajouter dans une classe centrale une méthode qui donne son singleton. Ça oblige à en faire la liste, mais ça n'a pas les inconvénients ci-dessus.


    Après, dans des situations très précises, il y a d'autres solutions pratiques, comme l'injection de dépendance.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    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 : 45
    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
    Un truc du genre?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     LogFactory logFactory = DiscoverSingleton.find(LogFactory.class);
    Tu trouvera ça dans apache dicovery.

    Bon, l'inconvénient, c'est que du coup tes programmeurs savent faire un new LogFactoryImpl() pour contourner le singelton.

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Sinon une solution simple et élégante pour créer un singleton, c'est de le définir comme une enum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public enum MaClasse {
        INSTANCE;
     
     
        // méthodes et attributs du singleton
    }


    • MaClasse.INSTANCE remplace MaClasse.getInstance()
    • Pas de problème de lazy-loading ou autre. On est sûr d'avoir une seule et unique instance.
    • Le Singleton est sérializable "proprement" (la désérialisation retournera bien MaClasse.INSTANCE et non pas une copie)



    a++

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Tiens ça fait un peu bizarre, mais c'est pas con.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Pour le coup, avec l'enum, on perd la possibilité d'héritage indiquée dans la question d'origine.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 325
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Le Singleton est sérializable "proprement" (la désérialisation retournera bien MaClasse.INSTANCE et non pas une copie)
    Bonjour,

    Je ne suis pas sur de bien comprendre. On peut se servir d'un singleton pour retourner l'instance d'une connexion, hors cet élément "connexion" n'est pas copiable ou sérializable. Donc un singleton ne sera pas forcément sérializable.

    La désérialisation doit forcément retourner une copie non ?
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Pour le coup, avec l'enum, on perd la possibilité d'héritage indiquée dans la question d'origine.
    Moi j'avais compris qu'ils héritaient tous de la même classe parentes, qui elle-même n'a pas de singleton, et que eux n'ont pas de sous-classe. Situation courante. D'un point de vue polymorphique, un singleton qui a des sous-types c'est pas très cohérent.
    ... Mais évidemment, s'il y a besoin d'héritage de ce genre, l'enum ne tient pas.

    Citation Envoyé par Gugelhupf Voir le message
    Je ne suis pas sur de bien comprendre. On peut se servir d'un singleton pour retourner l'instance d'une connexion, hors cet élément "connexion" n'est pas copiable ou sérializable. Donc un singleton ne sera pas forcément sérializable.

    La désérialisation doit forcément retourner une copie non ?
    Peut-être que tous les singletons ne sont pas sérialisables, mais beaucoup le sont. L'instance de connexion est loin d'être le seul exemple de pattern singleton. Et on pourrait se demander pourquoi il a besoin de tonnes de classes singleton pour des instances de connexion.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Tiens ça fait un peu bizarre, mais c'est pas con.
    J'ai souvent vu cette astuce... Simple et efficace !

    Citation Envoyé par joel.drigo Voir le message
    Pour le coup, avec l'enum, on perd la possibilité d'héritage indiquée dans la question d'origine.
    Le point sur l'héritage je l'ai compris uniquement pour éviter de réécrire le getInstance() à chaque fois...
    Sinon oui cela ne serait pas adapté.


    Citation Envoyé par Gugelhupf Voir le message
    La désérialisation doit forcément retourner une copie non ?
    Non car les enums sont traités spécifiquement par la sérialisation :
    • Lors de la sérialisation d'une enum, cela ne sauvegarde que son type et son nom.
    • Lors de la désérialisation d'une enum, la valeur correspondant est récupérer à partir de son type et de son nom (sûrement via Enum.valueOf())



    a++

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

Discussions similaires

  1. [C#] Peut-on dériver un attribut static ?
    Par 5:35pm dans le forum C#
    Réponses: 2
    Dernier message: 16/05/2006, 01h12
  2. Attributs static d'une classe
    Par Edouard Kaiser dans le forum C++
    Réponses: 15
    Dernier message: 04/04/2006, 00h17
  3. Réponses: 3
    Dernier message: 13/12/2005, 09h52
  4. Extension de déclaration d'un attribut static...
    Par SteelBox dans le forum C++
    Réponses: 7
    Dernier message: 15/02/2005, 20h23
  5. Attributs static
    Par poinclin dans le forum Langage
    Réponses: 4
    Dernier message: 18/06/2004, 14h57

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