Quelle est la meilleure façon de retourner une collection en Java?
Devrais-je permettre à l'appelant de fournir une collection à ajouter? Ou vient de renvoyer une liste Remarque: strong> L'exemple ci-dessus suppose la préexistence d'une liste pouvant être retournée instantanément. Je suis également intéressé par la réponse appropriée lorsque une telle liste n'existe pas auparavant et doit être générée lorsque l'appelant appelle GetItems () ou collectitems ().
(J'ai renommé Collecitems basé sur le point soulevé par Mykola.) P> p> <> code> ou
définir <> code> d'éléments? Ou les deux? P>
7 Réponses :
Il vaut mieux (à moins que certains problèmes de performance) ne résultent d'une fonction via Si vous choisissez une deuxième option (remplissez la collection du client) qu'il vaut mieux renommer la fonction de N'oubliez pas non plus les JavaBeans et sa convention. P> renvoyer code>. De cette façon, il est plus clair ce qui se passe. P>
getItems code> à quelque chose comme
rempliwithitems code> pour éviter le code ambigu. P>
Vous devriez retourner une collection. C'est une approche plus courante dans Java que d'utiliser des paramètres d'entrée / sortie. Je ne vois aucune raison où il y aurait une pénalité de performance pour renvoyer une grande collection et ce sera beaucoup de code plus propre. P>
Les pénalités sont pour faire la collecte que vous revenez à être immuables.
Donc, renvoyez une copie ou un clone de la collection. Pas moins d'une pénalité que de copier la collection dans un utilisateur créé un.
Compte tenu de la façon dont Java fonctionne, vous vous attendriez généralement à la version de retour. P>
Cependant, si vous avez besoin de contrôle sur quel type de collection est créé, vous feriez la version où vous le transmettez en tant qu'argument. P>
Généralement, rien ne devrait se soucier de quel type de collection est créé, de sorte que vous devriez généralement aller avec la version de retour. Bon usage de la non-réveil au bord de la voie. P>
Je préférerais simplement la liste Si la collecte d'éléments n'est pas toujours réalisée, vous pouvez envisager de revenir à GetItems renvoyer
void getItems (Collection Super élément> cible) code> sur l'appelant juste faire
mycollection.addall (foo.getems ()) code> performance ou non.
Collections.UnmodifiaLexYZ CODE> Crée uniquement une enveloppe, pas une copie complète de la collection, de sorte que si l'enveloppe est utilisée immédiatement et si jeté, il ne le fera jamais sortir de la première génération et sera collecté rapidement avec peu de frais généraux. p>
ibler <élément> code> lorsque vous ne savez pas combien d'articles il y a. Si vous connaissez le nombre d'articles et pouvez écrire un itérateur pour eux, il est facile d'écrire une sous-classe personnalisée de
abstractcollection code> et de retourner cela. P>
Remarque: retourner un ensemble et renvoyer une liste ont des implications différentes.
Un ensemble n'a aucun doublé et aucun ordre indiqué. L'ajout d'un élément à un ensemble peut entraîner un ordre différent des éléments. P>
Une liste peut contenir des doublons et l'ajout d'un élément ne changera pas (généralement) l'ordre général de la liste. P> Quant à la manière dont vous retournez la liste, j'utiliserais le premier formulaire: P>
public List<Item> getItems() { return Collections.unmodifiableList(this.myItems); }
Si je rassemble plusieurs collections ensemble, et chacun d'entre eux pouvait avoir 10 000 articles, je préférerais passer une collection de destination à sa place. Ou si le type de la collection est important (ensemble vs. List) et il y a de gros chiffres d'articles.
La seule raison pour laquelle je peux penser à remplir une collection existante plutôt que de faire une nouvelle est lorsque vous avez des problèmes avec le type d'objet dans la collection. Comme la bibliothèque Java Toarray (objet [] a) fonction, où le programme ne sait pas au moment de la compilation, quel sera le type approprié des éléments de la matrice, il ne peut donc pas simplement retourner, par ex. un string[]. Ainsi, ils ont au lieu de cela que l'appelant passe dans un tableau avec le type d'éléments approprié et ils remplissent cela. P>
90% du temps que vous connaissez exactement quels types d'objets que vous souhaitez revenir, afin que vous puissiez simplement le faire. p>
Vous pouvez changer votre signature pour renvoyer une collection ou iTable. Pour revenir, vous pouvez retourner une nouvelle quelque chose - iThable (myitems.iterator ()) au lieu des myitems directement pour éviter que le client essaye éventuellement de se lancer dans une liste (et de le modifier). Si vous ne voulez pas qu'ils modifiez la liste, envisagez également de renvoyer un itérateur également, mais notez que iTerEfer est préférable, car vous pouvez les utiliser directement à chaque boucle. p>
Renvoyer une iérente les deux rend votre intention clair et dans l'exemple ci-dessus, empêche la modification. La seule implication est que vous avez perdu un accès aléatoire, qui peut ou non être un problème pour vos besoins. p>
Étant donné que iTérable est une interface, neuf neufs (myitems.iterator ()) code> n'est pas légal; Vouliez-vous dire autre chose?
Ouais whoops, vous devriez retourner une nouvelle classe anonyme (ou une valeur de défaillance) qui l'applique.
+1 pour présenter des collections.unmodifiablelist. Exactement ce que je cherchais.