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 :

généricité et EnumMap


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Par défaut généricité et EnumMap
    Bonjour à toutes et tous,

    voilà mon questionnement :
    j'écris actuellement un projet où j'use au maximum de classes génériques. Au fur et à mesure des héritages, la liste des types génériques s'allonge (pour la plupart ce sont des classes abstraites qui héritent les unes des autres).

    En y réfléchissant différemment, je me suis dit que ce serait en fait pratique de constituer une liste de mes types génériques dans un enum, avec derrière la tête l'idée d'établir une correspondance entre le nom de mon type et le type réel à utiliser grace à une EnumMap.

    Ainsi par exemple, j'ai plusieurs type générique (T1, T2... Tn) qui dérivent de Number. Mais pour le moment, je ne vais avoir besoin que d'Integer. donc en fait au moment de fabriquer une classe concrète, je vais me trouver à écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class MaClass extends MaClassAbstraite<Integer,Integer,(etc...)>
    C'est long et ennuyeux, et ça implique au minimum de recompter mes types si je veux finalement en changer un lors de l'implémentation de la classe concrète ; alors que si je pouvais stocker des types en ecrivant un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EnumMap<EnumDesTypes, Class>
    et que la syntaxe me permette de substituer mon nom générique par le type correspondant, je me simplifierai la vie. Mais je ne vois pas comment écrire ça (mes essais se sont révélés infructueux).

    J'espère avoir été suffisamment clair. Sinon j'essaierai de vous fournir un exemple quand je serai à côté de ma machine (là je suis au taf...)

    Merci d'avance de vos réponses

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    Salut
    Donne un petit bout de code on comprend pas ce que tu cherche a faire exactement ;-)
    a++

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Par défaut Je reformule
    Toujours absent des abords de ma machine, je reformule un peu mon idée (qui ne fonctionne pas) pour que vous me disiez s'il existe d'autres moyens ou si j'ai juste mal écrit mes essais.

    Je simplifie donc :
    Je voudrais qu'une EnumMap MesTypes<String, Class> (je sais, ça ne s'écrit pas, et c'est là tout mon questionnement en fait) puisse me servir à avoir par exemple les correspondances suivantes :

    formatDeNombre -> Integer
    formatDIdentifiant -> String

    et qu'au moment de déclarer un membre dans une classe, au lieu d'écrire:
    Integer premierMembre;
    String deuxiemeMemre;

    je puisse ecrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MesTypes.get("formatDeNombre") premierMembre;
    MesTypes.get("formatDIdentifiant") deuxièmeMembre;
    Ca vous paraitra peut-être (sûrement ? ) barbare, inutile, ou que sais-je encore, mais je débute en POO et en Java, et c'est une question qui me semble digne d'intérêt à mon humble niveau.

    Alors, en élève consciencieux, je suis tout autant preneur d'une (de) solution(s) que d'une explication du pourquoi c'est pas possible ainsi (ou du tout).

    Merci à tous (et à hibour en particulier d'avoir jeté un œil sur mon premier post sur le forum)

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    Ce que tu veux faire n'est pas faisable en java tout simplement car java à un fort typage et chaque variable doit être déclaré avec son type qui soit primitif(int, long,..) ou référence (Object, String, ...) néanmoins si tu connais la métaclasse Class tu peux regarder dans cette direction, tu trouvera surement ce que tu recherche.
    Quand tu parle d'une EnumMap tu veux dire Map simplement je pense.
    tu peux faire ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    HashMap<String, Class> typeMembre = new HashMap<String, Class>();
    typeMembre.put("formatDeNombre", Integer.class);
    typeMembre.put("formatId", String.class);
    //....etc
    Class typePremierMembre = typeMembre.get("formatDeNombre");
    //Pour instancier il faut chercher le bon construteur..
    Voila a++

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Par défaut Je testerai ce week-end
    Merci pour ta réponse.
    Si je ne raconte pas de bêtise, il me semble que j'avais essayé un telle syntaxe, mais qu'Eclipse m'avait indiqué que l'utilisation correcte de Class impliquait d'écrire Class<T>...

    Je ne comprends pas encore bien comment faire usage de Class, mais je vais m'employer à me dégourdir le cerveau à ce sujet.

    Merci en tout cas pour ta réponse qui n'a pas manqué d'être prompte !!

    Et merci aussi pour le balisage et l'aération (je m'en chargerai au maximum à l'avenir).

    Si tout se passe bien pour moi, je passerai ce thread à l'état résolu dès que possible.

    ++

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Par défaut Ca ne marche malheureusement pas
    Bonsoir,

    Je tire mes citations de l'interface Eclipse.

    L'utilisation de Class telle qu'écrite dans ton message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public HashMap<String, Class> types = new HashMap<String, Class>();
    provoque un warning :
    Class is a raw type. References to generic type Class<T> should be parameterized
    Et lors de l'instanciation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        types.put("machin", Integer.class);
    Multiple markers at this line
    - Syntax error on token(s), misplaced construct(s)
    - Syntax error on token ""machin"", invalid
    FormalParameterList
    - Syntax error on tokens, FormalParameter expected
    instead
    Et l'usage d'un joker
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public HashMap<String, Class<?>> types = new HashMap<String, Class<?>>()
    ne change rien pour ce qui est de l'instanciation même si cela supprime le warning sus-cité...
    Je vais continuer d'y réfléchir, mais si tu as une autre idée, je suis preneur.

    A bientôt

Discussions similaires

  1. [architecture] pour de la généricité, vous feriez quoi ?
    Par Alec6 dans le forum Débats sur le développement - Le Best Of
    Réponses: 39
    Dernier message: 03/07/2006, 14h39
  2. Réponses: 6
    Dernier message: 21/11/2005, 13h40
  3. Explication Syntaxe , généricité ?
    Par elitost dans le forum Langage
    Réponses: 4
    Dernier message: 10/11/2005, 11h28
  4. [D7] généricité / portabilité d'une application
    Par Magnus dans le forum Bases de données
    Réponses: 7
    Dernier message: 01/09/2005, 08h39
  5. [Ada 95] Généricité de type/package
    Par kindool dans le forum Ada
    Réponses: 5
    Dernier message: 19/05/2005, 11h54

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