6
votes

Java: retourner une collection

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 <> ou définir <> d'éléments? Ou les deux? xxx

Remarque: 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.)


1 commentaires

+1 pour présenter des collections.unmodifiablelist. Exactement ce que je cherchais.


7 Réponses :


12
votes

Il vaut mieux (à moins que certains problèmes de performance) ne résultent d'une fonction via renvoyer . De cette façon, il est plus clair ce qui se passe.

Si vous choisissez une deuxième option (remplissez la collection du client) qu'il vaut mieux renommer la fonction de getItems à quelque chose comme rempliwithitems pour éviter le code ambigu.

N'oubliez pas non plus les JavaBeans et sa convention.


0 commentaires

0
votes

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.


2 commentaires

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.



0
votes

Compte tenu de la façon dont Java fonctionne, vous vous attendriez généralement à la version de retour.

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.

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.


0 commentaires

6
votes

Je préférerais simplement la liste getItems () méthode. Il n'y a pas d'avantage réel à void getItems (Collection cible) sur l'appelant juste faire mycollection.addall (foo.getems ()) performance ou non. Collections.UnmodifiaLexYZ 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.

Si la collecte d'éléments n'est pas toujours réalisée, vous pouvez envisager de revenir à GetItems renvoyer ibler <élément> 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 et de retourner cela.


0 commentaires

0
votes

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


1 commentaires

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.



0
votes

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.

90% du temps que vous connaissez exactement quels types d'objets que vous souhaitez revenir, afin que vous puissiez simplement le faire.


0 commentaires

0
votes

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.

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.


2 commentaires

Étant donné que iTérable est une interface, neuf neufs (myitems.iterator ()) 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.