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

avec Java Discussion :

Différencier des classes en fonction d'un attribut


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 63
    Points : 21
    Points
    21
    Par défaut Différencier des classes en fonction d'un attribut
    Bonjour,

    Mon problème est le suivant :

    J'ai plusieurs classes (ex : ListResponse, DeleteResponse, etc) qui hérite d'une classe Response. Chaque classe fait autre chose en fonction d'un type (ex : list, delete, etc).

    Mon objectif est de récupérer la classe en fonction de ce type, sans passer par un traitement du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(type.equals("list")){
     ListResponse resp = new ListResponse();
    } else if (type.equals("delete")){
    DeleteResponse resp = new DeleteResponse();
    }
    J'aimerai plutôt enregistrer chaque type de réponse dans une HashMap, du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    HashMap<String, Response> map = new HashMap<String, Response>();
    map.add("list", new ListResponse());
    map.add("delete", new DeleteResponse());
    et récupérer la classe voulue en fonction du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Response resp = (Response)map.get("list");
    Est-ce la bonne procédure? Est-ce que mon objet "resp" sera du type souhaité?

  2. #2
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Bonjour,

    Tu obtiendras bien une instance de la classe souhaitée, mais tu auras toujours la même instance, je ne sais pas si cela correspond à ce que tu veux.

    Si tu connais tous tes types à l'avance, je peux te conseiller de passer par un Enum qui contiendra la Classe que tu veux (ListResponse, DeleteResponse, etc.).

    Ainsi, tu pourras récupérer la bonne classe depuis l'enum et faire un newInstance() dessus.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 342
    Points : 419
    Points
    419
    Par défaut
    ton objet resp sera le même que celui de ta hashmap (même zone de la mémoire) si tu veut crée un nouvelle objet il te faudra utiliser la methode clone() de la classe object

    ps : la réponse est peut être HS car je répond sans vraiment comprendre ton problème

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 63
    Points : 21
    Points
    21
    Par défaut
    Pour être plus précis, j'aimerais effectuer ceci avec une servlet. Un clients envoie une requête au serveur dont voici un exemple en xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <type>list</type>
    <parameters>toto</parameters>
    Côté serveur, je réceptionne cette requête, analyse l'en-tête "type" et envoie une reponse en fonction de celui-ci.
    Pour l'instant, j'avais pensé à enregistrer la table de mapping dans le contexte initial afin qu'il soit créé une seule et unique fois mais je ne sais pas si c'est le plus approprié (en effet, ça pose problème si plusieurs utilisateurs veulent y avoir accès en même temps)...

    Avec les Enum, je vois pas comment il faut procéder...

  5. #5
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Alors, avec les enum, voilà en gros ce que ça pourrait donner:

    Tu aurais un enum MonType :
    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
    public enum MonType {
        // Déclaration de tous tes types possibles
        LIST(ListResponse.class),
        DELETE(DeleteResponse.class);
     
        private final Class<? extends Response> clazz;
     
        private MonType(Class<? extends Response> clazz) {
            this.clazz = clazz;
        }
     
        public Response newInstance() {
            return clazz.newInstance();
        }
    }
    Ensuite, quand tu récupères ton type sous forme de String, tu n'as plus qu'à récupérer le MonType associé et appeler la méthode newInstance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Response monInstance = MonType.valueOf(monTypeExtraitDeLaRequete.toUpperCase()).newInstance();

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 63
    Points : 21
    Points
    21
    Par défaut
    Cela me semble plus correcte qu'avec la HashMap, j'ai aussi essayé de voir avec la refléxivité mais on revient également à énumérer les classes...je te remercie

  7. #7
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Oui, et le gros avantage avec l'enum est que tu peux ajouter des propriétés si besoin est (droits nécessaires à cette opération, possibilité d'annuler, ...).

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/09/2013, 15h46
  2. utilisation des classes et fonctions d'une dll c++ en vb
    Par rigane_med dans le forum VB.NET
    Réponses: 0
    Dernier message: 24/06/2011, 00h52
  3. Réponses: 20
    Dernier message: 25/03/2010, 15h45
  4. utilisation des classes et fonctions d'une dll c++ en vb
    Par yuriashford dans le forum VB.NET
    Réponses: 2
    Dernier message: 26/05/2008, 15h21
  5. commentaire initial des classes et fonctions
    Par goran kajfes dans le forum Général Python
    Réponses: 3
    Dernier message: 04/11/2007, 18h53

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