J'utilise un service externe qui me renvoi un tableau d'objets. J'ai ensuite besoin de travailler sur ces données (ajout, suppression...). Je pense donc tout naturellement à transformer ce tableau en liste, bien plus facile à manipuler de manière "objet".
Je regarde donc si cette transformation n'est pas déjà fournie par Sun, pour ne pas réinventer la roue: bingo! Je tombe sur la méthode statique Arrays.asList(), que j'ajoute à mon code rapidement sans trop regarder plus loin.
Et c'est là que les soucis commencent... lorsque je veux supprimer des données de cette liste. Voici une simplification de ma méthode:
Jusque là, rien de choquant... (du moins j'espère). Si ce n'est que... ça ne marche pas avec une liste obtenue par Arrays.asList(): UnsupportedOperationException
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public removeObject(List l) { Iterator i = l.iterator(); while(i.hasNext()) { if(estASupprimer(i.next())) { i.remove(); } } }
En investiguant, j'ai trouvé l'explication:
Arrays.asList() renvoie une ArrayList... mais pas une java.util.ArrayList comme on a l'habitude de les utiliser. Elle renvoie une instance d'une classe interne: Arrays$ArrayList.
L'explication est donnée dans la javadoc: cette classe donne une liste de taille fixe (pas de méthodes add(), remove(), ...). Le tableau passé en paramètre à la création de la liste reste lié à celle-ci, et toute modification de la liste modifie en même temps le tableau associé. C'est cette contrainte qui impose la taille fixe.
Soit... mais bilan: je n'ai pas trouvé de classe native de Sun fournissant une méthode pour créer une liste à partir du tableau, tout en me permettant de manipuler librement celle-ci par la suite.
Si je n'ai pas suffisamment cherché, merci de me corriger.
Note: inutile de chercher... ce post ne contient pas de question (j'ai trouvé l'explication de mon unsupportedOperationException en lisant la javadoc). Ce post est juste là afin d'éviter que d'autres personnes ne fassent la même bétise que moi, en croyant (au père Noël) gagner du temps à ne pas lire comment se comporte une classe avant de l'utiliser.
PS: oui, il m'arrive encore parfois de rêver que des personnes feront une recherche avant de poster une question...
Moralité:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 public static List getTrueListFromFalseList(List l) { return new ArrayList(l); // ou LinkedList au choix }
Partager