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 :

Réalisation d'un 'adapteur' générique


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 253
    Par défaut Réalisation d'un 'adapteur' générique
    Bonjour à tous,
    voilà mon problème: j'utilise une API qui me permet d'ajouter des critère dans un objet requête. Voici une présentation de l'interface que je dois utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public Interface ISelectRequestBuilder {
      void addBlocType1(Type1 arg);
      void addBlocType2(Type2 arg);
      void addBlocType2(List<Type2> arg);
      void addBlocType3(Type3 arg);
      void addBlocType3(List<Type3> arg);
      ....
    }
    Tous les Type1, Type2, Type3... dérivent d'un même type. Appelons le "AbstractType".

    Ce que j'essaie de faire, sans succès pour l'instant , c'est un adapteur générique du genre:
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public Class MonAdapteur implements ISelectRequestBuilder{
      private ISelectRequestBuilder adpatee = null;
      public MonAdapteur(ISelectRequestBuilder adaptee){
        this.adaptee = adaptee;
      }
     
      // Les methodes adapatees
      public void addBlocType2(Type2 arg){
        adaptee.addBlocType2(arg);
      }
     
      // La partie adapteur
      public void addBloc(List<T extends AbstractType> arg){
        // Si la liste est null ou vide 
        if (criteres == null || criteres.size() < 1) {
    	// On ne fait rien
    	return;
        }
     
        // Recuperation du premier element pour determiner le type
        T critere = criteres.get(0);
        if (critere instanceof Type1) {
    	adaptee.addBlocType1((Type1) critere);
        }
        // else if .....
      }
    }
    J'ai pensé à paramétré ma classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public Class MonAdapteur<T extends AbstractType> implements ISelectRequestBuilder ....
     
    MonAdapteur<Type3> monAdapteur = new MonAdapteur<Type3>(..);
    .....
    mais je ne voit pas de grande différence

    Ma question est la suivante: existe-t-il une façon de faire qui permette d'éviter d'utiliser 'instanceof' et d'utiliser le polymorphisme ?


    Merci pour votre aide

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Je crois que java seul peut t'aider à résoudre ce souci. Pas même besoin de types paramétrés, Java fera tout seul la distinction :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    public abstract class TypeAbstrait {
      ...
    }
     
    public class TypeA extends TypeAbstrait {
      ...
    }
     
    public class TypeB extends TypeAbstrait {
      ...
    }
     
    public class TypeC extends TypeB { // Cas spécial, mais pris également en compte par Java.
      ....
    }
     
    public interface SelectBuilder {
      public void addBloc (TypeA... a);
      public void addBloc (TypeB... b);
      public void addBloc (TypeC... c);
    }
     
    public class SelectBuilderAdapter implements SelectBuilder {
      public void addBloc (TypeA... a) {
        ...
      }
      public void addBloc (TypeB... b) {
        ...
      }
      public void addBloc (TypeC... c) {
        ...
      }
    }
    Le seul inconvénient est si tu ne sais pas quel type tu reçois. En gros, si tu castes un objet TypeA en TypeAbstrait et que tu le passes. Dans ce cas, tu dois passer par des instanceof. Mais ce cas ne devrait pas se produire, si l'on en croit ton interface.

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 253
    Par défaut
    Merci pour cette réponse rapide
    J'avais déjà essayé ça mais le PB c'est qu'il y a aussi des listes et j'ai une erreur de compil quand je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public void addBloc(List<TypeA> arg){...}
    public void addBloc(List<TypeB> arg) {...}
    Je pense avoir une solution avec l'ellipse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void addBloc(TypeA... criteres){
      if (criteres == null || criteres.length < 1){ return;}
      if (criteres.length == 1) {
        addBlocTypeA(criteres[0]);
      } else { // Plusieurs elements
        addBlocTypeA(Arrays.asList(criteres));
      }
    }


    Si quelqu'un voit une autre solution, je suis preneur. (C'est toujours mieux quand on a le choix. Encore faut-il faire le bon ou le moins pire )

    Sinon, je marquerai le fil résolu demain.

    Merci encore

  4. #4
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Je ne comprends pas très bien l'ensemble.

    En tous les cas, un adaptateur puissant pour toutes sortes d'interfaces est le Proxy, mais là c'est le règne du instanceof.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public void addBloc(List<TypeA> arg){...}
    public void addBloc(List<TypeB> arg) {...}
    Effectivement, c'est bien une erreur de compilation. Car même si conceptuellement ce sont deux types distincts (une liste de TypeA, une liste de TypeB), en réalité, java ne voit qu'un seul type : java.util.List et tu as donc deux méthodes avec la même signature, ce qui pose problème. C'est pour ça que j'ai proposé des ellipses dans ma solution. C'est sensiblement différent de la liste, mais utilisable (de manière peu conventionelle, je l'admets) le cas échéant avec l'instruction suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<TypeA>.toArray(new TypeA[XXX]);

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 253
    Par défaut
    Citation Envoyé par dingoth Voir le message
    C'est pour ça que j'ai proposé des ellipses dans ma solution.
    Merci dingoth, j'avais lu un peu rapidement ta solution et n'avais pas bien vu les elipses
    Pour l'instant, c'est la solution que je retiens avec la convertion de tableau en liste pour les appels
    Par contre, une précision, je ne peux pas modifier l'interface ISelectRequestBuilder. Elle est issue d'un autre projet; c'est donc une archive (jar) que j'utilise. C'est la raison pour la quelle je fait cet adaptateur.
    Merci pour vos contributions. Si quelqu'un a une autre (meilleure) solution ou tout simplement pour confirmer que celle-ci est bonne ... n'hésitez pas et faites nous part de vos obervations.
    Le sujet sera marqué résolu demain.

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

Discussions similaires

  1. msi ou comment réaliser un installeur?
    Par herzleid dans le forum Delphi
    Réponses: 11
    Dernier message: 09/04/2007, 20h27
  2. Réaliser un Chat avec support IP
    Par Sub0 dans le forum Développement
    Réponses: 12
    Dernier message: 14/07/2006, 11h59
  3. caractère générique utilisable dans strcmp
    Par barthelv dans le forum C
    Réponses: 9
    Dernier message: 01/08/2003, 17h54
  4. [Radio fréquence] réalisation d'une application
    Par WriteLN dans le forum Développement
    Réponses: 14
    Dernier message: 05/06/2003, 15h36
  5. [imprecis]Réaliser a^n avec seulement l'opérateur d'addition
    Par Amon dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 08/11/2002, 23h22

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