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 :

Generics et méthodes statiques


Sujet :

Langage Java

  1. #1
    Membre averti Avatar de BakaOnigiri
    Inscrit en
    Avril 2002
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 366
    Points : 437
    Points
    437
    Par défaut Generics et méthodes statiques
    Bonjour,

    je suis tombé sur un petit problème de design aujourd'hui, j'en ai donc fait un petit exemple très simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Generale
    {
        public static void test()
        {
            System.out.println("test 1");
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Ajout extends Generale
    {
        public static <T extends Generale> void petitTest()
        {
            T.test();
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Besoin1 extends Ajout
    {
        public static void test()
        {
            System.out.println("Besoin 1");
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Besoin2 extends Ajout
    {
        public static void test()
        {
            System.out.println("Besoin 2");
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Main
    {
        public static void main(String[] args)
        {
            Besoin1.petitTest();
            Besoin2.petitTest();
        }
    }
    Résultat :

    run:
    test 1
    test 1

    Je pense bien comprendre que çà vienne du fait que je travail sur des méthodes statiques.

    Mais j'ai 3 questions : pourquoi çà fait pas ce que je veux (à savoir : afficher les messages de Besoin1 et 2) ? pourquoi çà génère pas d'erreur de compilation ? comment contourner le problème (sachant que je ne peut pas du tout toucher au code de la classe Generale) ?


    Merci d'avance.

  2. #2
    Expert éminent sénior
    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
    Points : 48 804
    Points
    48 804
    Par défaut
    les méthodes statiques ne sont pas héritée. donc dans petitTest, a la compilation, on évalue déjà que tu veux appeler la méthode statique sur Generale.

  3. #3
    Membre averti Avatar de BakaOnigiri
    Inscrit en
    Avril 2002
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 366
    Points : 437
    Points
    437
    Par défaut
    Ok, donc je reformule mon problème :

    je doit ajouter la méthode 'petitTest' à toutes mes classes BesoinX (dans mon vrai programme j'en ai 8 mais çà peut venir à augmenter).

    petitTest est bien sûr plus compliqué que çà, mais j'ai pas envie de dupliquer plusieurs le code dans chaque classes, et petitTest doit appeler la méthode test de chaque classes BesoinX.


    Comment je fait ? on m'a conseillé de réécrire petitTest comme çà :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    petitTest(Class<T> clazz) .....

    Mais je fait quoi avec clazz ? es-ce que c'est valable ?

  4. #4
    Expert éminent sénior
    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
    Points : 48 804
    Points
    48 804
    Par défaut
    test() ne dois pas etre statique.

    edit: et accessoirement tu n'a absolument pas besoin de generic dans le cas présent, c'est juste un problème d'héritage.

  5. #5
    Membre averti Avatar de BakaOnigiri
    Inscrit en
    Avril 2002
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 366
    Points : 437
    Points
    437
    Par défaut
    Je ne peut pas toucher du tout a la classe Generale, et donc je ne peut pas modifier la signature de la méthode test().

    Je ne vois pas comment éviter la duplication de code

  6. #6
    Expert éminent sénior
    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
    Points : 48 804
    Points
    48 804
    Par défaut
    heu tu peux modifier le pere mais pas les enfants, et donc tu veux modifer le pere our qu'il fasse un traitement dependant des enfant, ca sent la grosse bourde de design

  7. #7
    Membre averti Avatar de BakaOnigiri
    Inscrit en
    Avril 2002
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 366
    Points : 437
    Points
    437
    Par défaut
    Non, je peut modifier les enfants, mais pas le père, en fait je peut modifier tout le monde sauf la classe Generale, je veux que chaque enfant puisse avoir une méthode à signature commune, qui a une partie dépendant du type d'enfant.

    Pour info mon problème est liée au rajout d'une méthode findXXX dans un modèle de donné utilisé dans le framework play!.


    J'ai posé ma question là : http://groups.google.com/group/play-...7f9f3467cfd5b0 la classe Generale correspond à la classe JPASupport / GenericModel (là première dérivant de la seconde et étant maintenant dépréciée dans la version 1.1 du framework)

  8. #8
    Expert éminent sénior
    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
    Points : 48 804
    Points
    48 804
    Par défaut
    si c'est une méthode que t'ajoute dans un fils, suffit qu'elle soit non statique. Suivant l'enfant que tu utilise le code sera différent.

  9. #9
    Membre averti Avatar de BakaOnigiri
    Inscrit en
    Avril 2002
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 366
    Points : 437
    Points
    437
    Par défaut
    Sauf que çà m'embête d'instancier un fils pour du code clairement statique.

    En modifiant de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Ajout extends Generale
    {
        public static <T extends Generale> void petitTest(Class<T> clazz)
        {
            try {
                Method m = clazz.getMethod("test", null);
                m.invoke(null, null);
            } .....
        }
    }
    et comme çà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Main
    {
        public static void main(String[] args)
        {
            Besoin1.petitTest(Besoin1.class);
            Besoin2.petitTest(Besoin2.class);
        }
    }
    Ça passe, mais j'aime pas la manière de faire

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 631
    Points
    21 631
    Par défaut
    Citation Envoyé par BakaOnigiri Voir le message
    Sauf que çà m'embête d'instancier un fils pour du code clairement statique.
    Ça n'a absolument rien de statique. Alors le clairement en plus, hein.

  11. #11
    Membre averti Avatar de BakaOnigiri
    Inscrit en
    Avril 2002
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 366
    Points : 437
    Points
    437
    Par défaut
    Bon il semble que le mot 'clairement' n'était pas le bon. Je voulais trouver un mot pour dire que je sais que mes méthodes doivent être statique.

    Je me suis mal exprimé, ça froisse des gens.

    On va conciderer que le problème est clos, j'ai pas envie de rentrer en guerre contre certaines personnes du forum.

  12. #12
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 620
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 620
    Points : 15 697
    Points
    15 697
    Par défaut
    Le problème n'est juste pas soluble. Ce qui est statique et relatif à la classe même et n'est donc pas hérité. C'est le fonctionnement normal de java et on ne peut pas le changer.

    Si tu veux gérer la surcharge, tu es obligé d'utiliser du non statique.

  13. #13
    Membre averti Avatar de BakaOnigiri
    Inscrit en
    Avril 2002
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 366
    Points : 437
    Points
    437
    Par défaut
    Oui, c'est bien ce que j'avais compris dès la première réponse.

    C'est donc clairement un problème de design, mais je ne peut pas mettre mes méthodes en non statiques, de par ce que font ces méthodes, çà n'a pas de sens.

    Je vais donc essayer de trouver un autre moyen.

  14. #14
    Expert éminent sénior
    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
    Points : 48 804
    Points
    48 804
    Par défaut
    si j'ai bien compris, ces méthodes construisent des objet. Alors elles devraient être sorites des ces dits objet et placée dans une factory séparée. Factory qu'il y aura alors du sens à instancier

  15. #15
    Membre averti Avatar de BakaOnigiri
    Inscrit en
    Avril 2002
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 366
    Points : 437
    Points
    437
    Par défaut
    Oula ! çà semble être la solution, mais j'ai encore jamais mis en place de factory dans mes programmes java.

    Merci je vais chercher des docs.

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

Discussions similaires

  1. méthodes statiques java équivalence c++
    Par loacast dans le forum C++
    Réponses: 3
    Dernier message: 09/12/2006, 18h57
  2. Dynamic link et Méthode statique
    Par Higestromm dans le forum C++
    Réponses: 2
    Dernier message: 19/05/2006, 22h07
  3. Pthreads, méthode statique ?
    Par tibouchou dans le forum C++
    Réponses: 4
    Dernier message: 15/03/2006, 21h51
  4. [C#] interface, méthodes statiques ?
    Par gmonta dans le forum C#
    Réponses: 6
    Dernier message: 02/12/2005, 10h27
  5. [Singleton] Différences avec méthodes statiques
    Par Franche dans le forum Design Patterns
    Réponses: 1
    Dernier message: 26/02/2003, 17h10

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