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 :

Classe générique : utiliser le composant générique


Sujet :

Langage Java

  1. #1
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut Classe générique : utiliser le composant générique
    Bonjour à toutes et à tous,


    1) J'aimerai utiliser mon composant générique de ma classe pour récupérer le nom de sa classe et ses variables.
    Je m'explique, voici la forme de ma classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Class A<T>
    {
     
    public void test ()
    {
    // J'aimerai faire quelque chose comme T.class du genre
    Class<T> tmp;
    Fields[] flds = tmp.getFields();
    }
    }
    Cependant, dans l'exemple ci dessus, il faut que j'initialise tmp mais comment?

    2) De plus, j'en profite pour demander comment récupérer les variables privées car getFields récupérés les variables publics.

    Seriez vous m'aider?

    Merci à tous

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Citation Envoyé par David55 Voir le message
    Cependant, dans l'exemple ci dessus, il faut que j'initialise tmp mais comment?
    Il faut fournir l'objet Class correspondant à T lors de la construction de l'objet A.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private final Class<T> itemClass;
     
    public A(Class<T> itemClass) {
      this.itemClass = itemClass;
    }
    Citation Envoyé par David55 Voir le message
    2) De plus, j'en profite pour demander comment récupérer les variables privées car getFields récupérés les variables publics.

    Seriez vous m'aider?
    Oui : débrouille-toi pour t'en passer, en organisant ton programme autrement. (Par exemple en exigeant que T étende une interface qui fournit les données que tu as besoin de récupérer.)
    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 483
    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 483
    Par défaut
    bien qu'on puisse retrouver par introspection les champs privé, comme dit elvin, il est préférable de forcer l'implémentation d'une interface précise.

  4. #4
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    Merci à vous deux ca confirme ce que je pensais pour les deux solutions

    Merci encore

  5. #5
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Hello,

    pour 1) c'est quand même faisable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class MyClass<T> {
      private final Class<?> aClass;
     
      public MyClass() {
        ParameterizedType superclass = (ParameterizedType) getClass().getGenericSuperclass();
        this.aClass = (Class<?>) superclass.getActualTypeArguments()[0];
      }
    }
    c'est notament ce que j'utilise dans mes tests de dao pour instancier dynamiquement le dao dans une classe mère en fonction du type generic déclaré par le test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    abstract class DaoTest<T extends MyAbstractDao> {
        protected final T dao; 
     
      public DaoTest() {
        ParameterizedType superclass = (ParameterizedType) getClass().getGenericSuperclass();
        Class<T> aClass = (Class<T>) superclass.getActualTypeArguments()[0];
        this.dao = aClass.newInstance(); 
      }
    }
     
    class CustomerDaoImplTest extends DaoTest<CustomerDaoImpl> {
    ...
    }

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Techniquement, c'est pas ce qui était demandé.
    Je suppose que c'est à savoir, mais bon... Personnellement je préfère réorganiser les choses pour qu'elles soient simples et reflètent ce que je veux faire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    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 Pill_S Voir le message
    pour 1) c'est quand même faisable:
    Cette solution a plusieurs contraintes :

    • La classe de base doit être abstraite.
    • Les classes filles doivent impérativement spécifier en dur l'attribut Generics.


    En gros si je fais ceci cela ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class MySubClass<T> extends MyClass<T> {
     
    }

    Il serait préférable d'utiliser la solution de thelvin, c'est à dire de passer par un argument...



    Sinon plus globalement avant de donner des solutions, il faudrait savoir ce que veux faire David55 exactement (et non pas comment il veut le faire).


    a++

  8. #8
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    La solution de thelvin me convient très bien

    Mais merci tout de même à Pill_S c'est toujours bon de savoir ca

  9. #9
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    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 483
    Par défaut
    Citation Envoyé par Pill_S Voir le message
    Hello,

    pour 1) c'est quand même faisable:
    C'est se tirer le nouille pour rien ce code. En effet, il ne marche que si tu fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class MaClasseConcrete extends MaClassAbstraite<MonTypeConcret>
    et encore à condition de ne jamais faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public class MaClasseConcrete2 extends MaClasseConcrete{
    }
    => il faut alors que MaClasseConcrete soit final pour éviter ça.

    Ca ne marche pas non plus si tu fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaClassParametree<MonType> instance = new MaClassParametree<MonType>();
    ce qui est pourtant un construction très courante.

    Il est de loin préférable pour la clareté du code et sa flexibilité, si tu veux forcer le type concret, de passer par ce code:
    alternative 1:
    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
     
    class MaClassAbstraite<T> {
      private final Class<? extends T> aClass;
     
      public MaClassAbstraite(Class<? extends T> aClass) {
        this.aClass = aClass;
      }
    }
     
    public class MaClasseConcrete  extends MaClassAbstraite<MonTypeConcret>{
      public MaClasseConcrete  (){
         super (MonTypeConcret.class);
      }
    }
     
    // ou (de mémoire)
    MaClassAbstraite<MonType> instance = new MaClassAbstraite<MonType>(MonType.class){};
    alternative 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class MaClassAbstraite<T> {
     
       protected abstract T creerUneInstance(); // puisque, a priori, on n'en aura besoin en général que pour créer par introspection des instances, autant déléguer directement cette création :)
    }

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/05/2008, 23h19
  2. Probléme de Classe utilisant un collection générique.
    Par hawax dans le forum Windows Forms
    Réponses: 8
    Dernier message: 01/05/2008, 16h25
  3. [Liferay] Conseil de mise en oeuvre d'un composant générique
    Par erwan.bodere dans le forum Portails
    Réponses: 4
    Dernier message: 31/05/2007, 16h12
  4. [ADO.NET] composant générique d'accès au données
    Par paradeofphp dans le forum C#
    Réponses: 1
    Dernier message: 26/01/2007, 00h54
  5. caractère générique utilisable dans strcmp
    Par barthelv dans le forum C
    Réponses: 9
    Dernier message: 01/08/2003, 17h54

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