[RESOLU] Extraire un sous-type d'une arrayList

Extraire un sous-type d'une arrayList [RESOLU] - Java - Programmation

Marsh Posté le 01-07-2011 à 21:17:58    

Bonjour,
 
J'ai le problème suivant.
J'ai une super-classe A
Et deux classes : B extends A, et C extends A
 
J'ai ensuite une liste "list = new ArrayList<A>()", qui peut contenir des objets de type A, B ou C.
 
J'ai envie d'extraire de "list" une sous-liste listB qui ne contient que des éléments de type B.
 
Comment faire, sans utiliser l'operateur instanceof ?
merci !


Message édité par Facewindu le 02-07-2011 à 15:38:38
Reply

Marsh Posté le 01-07-2011 à 21:17:58   

Reply

Marsh Posté le 02-07-2011 à 14:12:42    

Bon,
 
j'ai un moyen de faire autrement, car je peux extraire ma sous-liste à la création.
 
Lorsque je crée un objet B, je peux le mettre dans la liste globale "list", et aussi dans la liste secondaire "listB"
Idem pour les objets C.
 
Cette solution ne me plaît que moyennement, car je dois me trimballer mes trois listes lis, listB, listC.
Je cherchais une manière élégante qui me permette de ne bosser qu'avec la liste globale "list".
 
Si personne ne trouve, tant pis, c'est pas la mort :)

Reply

Marsh Posté le 02-07-2011 à 14:23:52    

bah pourquoi du veux pas d'instance of :??: c'est fait pour ça :o


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 02-07-2011 à 14:54:46    

Parce que instanceof est considéré comme du bad programming. Je lis partout que si on compte l'utiliser, c'est que le design est pas bon.
Mais là, je vois pas comment changer mon design.
 
Enfin, si, je vois bien un truc.
définir dans A les méthodes que je veux appliquer à mes objets B et C.
Et les surcharger dans B et C.
Du coup, je bosse avec ma list globale (qui contient des A, des B, et des C).
 
Un truc du genre :
class A {
  execute(){
    //rien du tout
  }
}
 
class B extends A {
  execute(){
    ce que je veux faire avec les objets B
  }
}
 
class C extends A{
  execute(){
    ce que je veux faire avec les objets C
  }
}
 
Et ensuite quand j'ai ma liste globale, je fais execute() sur tous les éléments. SI c'est juste un A, il fait rien, si c'est un B ou un C il fait la methode exectue de B ou C

Reply

Marsh Posté le 02-07-2011 à 15:15:06    

Code :
  1. for (A a : list) {
  2.   try {
  3.    B b = (B) a;
  4.    b.execute();
  5.   } catch (ClassCastException e) {}
  6.  }


 
:whistle:


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 02-07-2011 à 15:23:10    

Facewindu a écrit :

Parce que instanceof est considéré comme du bad programming. Je lis partout que si on compte l'utiliser, c'est que le design est pas bon.
Mais là, je vois pas comment changer mon design.
 
Enfin, si, je vois bien un truc.
définir dans A les méthodes que je veux appliquer à mes objets B et C.
Et les surcharger dans B et C.
Du coup, je bosse avec ma list globale (qui contient des A, des B, et des C).
 
Un truc du genre :
class A {
  execute(){
    //rien du tout
  }
}
 
class B extends A {
  execute(){
    ce que je veux faire avec les objets B
  }
}
 
class C extends A{
  execute(){
    ce que je veux faire avec les objets C
  }
}
 
Et ensuite quand j'ai ma liste globale, je fais execute() sur tous les éléments. SI c'est juste un A, il fait rien, si c'est un B ou un C il fait la methode exectue de B ou C


C'est pas loin du pattern visiteur :
 

Code :
  1. class B extends A {
  2.   Public void filtre(list l){
  3.          L.add(this)
  4. }
  5. }


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 02-07-2011 à 15:37:32    

Tout à fait, zapan666, c'est un Visitor pattern qu'il me faut
http://sourcemaking.com/design_patterns/visitor/java/1
 
Ca rajoute beaucoup de code, mais au moins c'est très propre.
Un désavantage que je lui trouve, c'est qu'il faut remplir l'interface Visitor avec des méthodes pour tous les éléments.
Donc si on rajoute un élément, il faut rajouter une méthode dans l'interface, et donc dans toutes les classes Operations qui implémentent cette interface Visitor.
 
Mais en tout cas, c'est ce que je recherche. Merci ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed