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 :

Solution alternative à instanceof


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Solution alternative à instanceof
    Bonjour,

    D'aprés vous, l'usage du mot clef instanceof est il nécessaire sur le code suivant? (sachant que le code en gras ne peut pas être modifié):

    public class Test {

    public static void main(String[] args) {
    Test test = new Test();
    test.process();
    }

    public void process() {
    Item[] item = new Item[3];
    item[0] = new Item();
    item[1] = new Item1();
    item[2] = new Item2();

    for(int i=0; i<item.length;i++) {
    if(item[i] instanceof Item1) {
    display((Item1) item[i]);
    } else if(item[i] instanceof Item2) {
    display((Item2) item[i]);
    } else {
    display(item[i]);
    }
    }
    }

    private void display(Item item) {
    System.out.println("Item");
    }

    private void display(Item1 item) {
    System.out.println("Item 1");
    }

    private void display(Item2 item) {
    System.out.println("Item 2");
    }
    }

    class Item {

    }

    class Item1 extends Item {

    }

    class Item2 extends Item {

    }
    Le but de ce topic est de définir des solutions alternatives à l'usage du mot-clef instanceof.

    Merci d'avance pour votre aide.

  2. #2
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Points : 313
    Points
    313
    Par défaut
    Bonjour,

    Vous pouvez utiliser le principe d'héritage :

    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
    class Item {
       public boolean isItem1() {
           return false;
       }
       public boolean isItem2() {
           return false;
       }
    }
     
    class Item1 extends Item {
        public boolean isItem1() {
            return true;
        }
    }
     
    class Item2 extends Item {
       public boolean isItem2() {
           return true;
       }
    }

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    implémenter des méthode pour donner ton nom c'est de a redondance par rapport à getClass().getName()

    Ceci dit, dans le code donnée, les instanceof sont encore les plus propre pour des petites quantités. Pour beaucoup de classes différentes, il existe d'autres patterns plus souples

  4. #4
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Points : 313
    Points
    313
    Par défaut
    Tout à fait juste, d'autant plus que nightcoder précisait :
    (sachant que le code en gras ne peut pas être modifié)

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bonsoir, merci pour vos réponses.

    tchize_ : "Pour beaucoup de classes différentes, il existe d'autres patterns plus souples". Tu fais référence à quel pattern ? Visitor ?

    Dans le cas de beaucoup de instanceof (une cinquantaine à peu prés), je pense qu'il serait plus propre d'opter pour une autre approche. Mais je ne vois pas de solutions propre dans mon cas (Sans modification des classes testé (Item)).

    Si vous avez d'autres suggestions, n'hesitez pas.

    Merci encore .

  6. #6
    Membre habitué

    Profil pro
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 163
    Points
    163
    Par défaut
    Bonjour,

    En respectant tes "règles du jeu" tu devrais pouvoir utiliser un adptateur:
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    public class Test {
     
      interface IAdaptateur {
        void display();
      }
     
      class Adaptateur implements IAdaptateur {
        private Item item;
     
        public Adaptateur(Item item) {
          this.item = item;
        }
     
        @Override
        public void display() {
          System.out.println("Item = " + item.toString());
        }
      }
     
      class Adaptateur1 implements IAdaptateur {
        private Item1 item;
     
        public Adaptateur1(Item1 item) {
          this.item = item;
        }
     
        @Override
        public void display() {
          System.out.println("Item 1 = " + item.toString());
        }
      }
     
      class Adaptateur2 implements IAdaptateur {
        private Item2 item;
     
        public Adaptateur2(Item2 item) {
          this.item = item;
        }
     
        @Override
        public void display() {
          System.out.println("Item 2 = " + item.toString());
        }
      }
     
      public static void main(String[] args) {
        Test test = new Test();
        test.process();
      }
     
      public void process() {
        IAdaptateur[] adaptateur = new IAdaptateur[3];
        adaptateur[0] = new Adaptateur(new Item());
        adaptateur[1] = new Adaptateur1(new Item1());
        adaptateur[2] = new Adaptateur2(new Item2());
     
        for (int i = 0; i < adaptateur.length; i++) {
          adaptateur[i].display();
        }
      }
    }
     
    class Item {
     
    }
     
    class Item1 extends Item {
     
    }
     
    class Item2 extends Item {
     
    }

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par nightcoder Voir le message
    Bonsoir, merci pour vos réponses.

    tchize_ : "Pour beaucoup de classes différentes, il existe d'autres patterns plus souples". Tu fais référence à quel pattern ? Visitor ?
    sleroux a répondu en partie à la question.

    Simplement, quand on a beaucoup de classes différentes (en plus de beaucoup de instanceof), pour factoriser un peu le code, on établit une convention de nommage sur les adaptateur (exemple: dois prendre le nom de la classe suivie de Adaptater) et on crée l'adaptateur par réflexion:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Class.forName(item.getClass().getName()+"Adapter")
    , ce qui permet assez souplement à chacune de tes librairies de fournir son propre set d'adaptateur pour les Item qu'elle embarque

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci pour vos réponses!

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    je rajoute que c'est la méthode utiliser par la classe BeanInfo, qui permet de fournir des éditeurs spécifique à tes beans

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

Discussions similaires

  1. [XL-2003] Solution alternative aux DialogSheets
    Par AlexIsOnFire dans le forum Excel
    Réponses: 2
    Dernier message: 21/07/2010, 23h31
  2. connexion à distance à une BDD mySQL ou solution alternative ?
    Par alloa28 dans le forum Administration
    Réponses: 0
    Dernier message: 17/07/2010, 13h44
  3. Solution alternative de recherche de fichier windows
    Par Anevada dans le forum C++Builder
    Réponses: 2
    Dernier message: 02/11/2009, 10h29
  4. [JavaFx] Avantage / Inconvénients (/solutions alternatives ?)
    Par Ar3s. dans le forum Eclipse Platform
    Réponses: 0
    Dernier message: 28/07/2009, 13h11
  5. Réponses: 6
    Dernier message: 11/03/2009, 12h26

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