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

Collection et Stream Java Discussion :

Investigations sur la méthode Arrays.asList()


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut Investigations sur la méthode Arrays.asList()
    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:

    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();
          }
       }
    }
    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

    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
    }
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,



    Si tu veux manipuler une vrai liste il faut que tu la crées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	List<String> list = new ArrayList<String>( Arrays.asList(array) );
    Ou mieux (on évite une classe intermédiaire) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	List<String> list = new ArrayList<String>();
    	Collections.addAll(list, array);

    Je rappelle juste que la plupart des méthodes de l'interface Collection (et de ses sous-interfaces) sont optionnelles : il n'y a rien de choquant à ce qu'elle ne soit pas implémenté

    a++

  3. #3
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Oui, merci. C'est également la conclusion à laquelle j'étais arrivé
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Par défaut
    Juste pour ajouter une remarque sans grand intérêt :

    Ce qui me pose vraiment problème avec le parcours des collections Java, c'est la méthode "remove" de Iterator qui throw une UnsupportedOperationException sur les objets pour lesquels elle ne peut s'appliquer.

    Je trouve que c'est un gros problème de conception que d'offrir des fonctionnalités qui seront interdite à l'exécution, je ne comprends pas pourquoi il n'a pas été conçu un Iterator en lecture/seule et un Iterator en lecture/suppression...

    Enfin bon, a priori ça ne va pas être revu tout de suite alors il va falloir s'y faire ou créer ses propres itérateurs en attendant...

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Parce que ce problème ne se retrouve pas seulement pour la méthode remove() de l'iterator. Plusieurs méthodes des collections sont en effet optionnelles !



    Déjà si on duplique l'interface Iterator afin d'avoir un ReadOnlyIterator il faudrait dupliquer aussi l'interface Collection et toutes ses sous interfaces, pour distinguer les Collections qui utiliserait un Iterator des "ReadOnlyCollections" qui utiliserait un ReadOnlyIterator...

    Si on ajoute à cela les méthodes optionnelles de l'interface Collection (add(), addAll(), remove(), removeAll(), retainAll(), clear()) il faudrait déjà 8 interfaces différentes... ce qui n'est pas forcément mieux que la solution actuelle...


    je ne sais pas s'il existe un pattern "propre" pour gérer des méthodes optionnelles...

    a++

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Par défaut
    On pourrait envisager Iterator extends ReadOnlyIterator et Collection extends ReadOnlyCollection, cela ne me choque pas du tout...

    Mais bon les 2 points de vue son discutables, après c'est une question de goût et surtout de compromis

Discussions similaires

  1. [Sequoia] Votre avis sur la Méthode
    Par Zorro dans le forum Autres
    Réponses: 5
    Dernier message: 21/05/2008, 16h02
  2. [POO] ajout méthodes sur l'objet Array
    Par kimcharlene dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 24/04/2008, 16h40
  3. Conseils sur la méthode de développement objet métier
    Par RamDevTeam dans le forum Langage
    Réponses: 5
    Dernier message: 08/12/2005, 18h14
  4. [WebServices][axis] question sur la méthode service()
    Par Nycos62 dans le forum Services Web
    Réponses: 9
    Dernier message: 21/04/2005, 09h32
  5. Réponses: 3
    Dernier message: 16/04/2004, 16h51

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