69 votes

Quand dois-je utiliser Itérable vs Collection en Java?

Quelles sont les considérations de l'utilisation de Iterable<T> vs Collection<T> en Java?

Par exemple, envisager de mettre en œuvre un type qui est principalement concerné par l'contenant une collection d' Foos, et certaines métadonnées associées. Le constructeur de ce type permet un temps d'initialisation de la liste des objets. (Les métadonnées peut être fixée plus tard.) Ce type de ce constructeur accepter? Iterable<Foo>ou Collection<Foo>?

Quelles sont les raisons de cette décision?

Suivant le modèle mis de l'avant par la bibliothèque de types, tels que ArrayList (qui peuvent être initialisées à partir de n'importe quel Collection, mais pas un Iterable) m'a conduit à utiliser Collection<Foo>.

Mais pourquoi ne pas accepter Iterable<Foo>, étant donné que c'est suffisant pour l'initialisation des besoins? Pourquoi exiger un niveau plus élevé de fonctionnalité (Collection) de la consommation, que ce qui est strictement nécessaire (Iterable)?

64voto

Jon Skeet Points 692016

De nombreux types de collection existé avant d' Iterable<T> (qui n'a été introduite dans la version 1.5) - il n'y a guère de raison d'ajouter un constructeur à accepter Iterable<T> ainsi que Collection<T> , mais en changeant le constructeur existant aurait été d'une modification de rupture.

Personnellement, j'utiliserais Iterable<T> si vous permettant de faire tout ce que vous souhaitez. C'est plus souple pour les appelants, et, en particulier, il vous permet de faire relativement facile de filtrage/projection/etc à l'aide de Google Java Collections (et sans doute bibliothèques similaires).

22voto

Adam Paynter Points 22056

Un Iterable produit Iterator objets. Un Iterator objet, par définition, effectue une itération. Un avis, que l' Iterator interface ne fait aucune promesse quant à combien de fois next() peut être appelée avant hasNext() retours false. Un Iterator pourrait parcourir Integer.MAX_VALUE + 1 valeurs avant son hasNext() méthode renvoie false.

Cependant, une Collection est une forme particulière de l' Iterable. Parce qu'un Collection ne peut pas avoir plus de Integer.MAX_VALUE - éléments (en vertu de l' size() méthode), il est naturellement présumer que son Iterator - les objets seront pas parcourir plus de cela, de nombreux éléments.

Par conséquent, en acceptant un Collection plutôt qu'un Iterable, votre classe peut avoir une certaine garantie sur la façon dont de nombreux éléments sont passés dans. Ceci est particulièrement utile si votre classe est elle-même un Collection.

Juste mes deux cents...

8voto

Michael Myers Points 82361

L'utilisation la plus générale de l'interface que vous le pouvez. Depuis toutes que vous allez faire est d'effectuer une itération, alors je dirais Iterable est la voie à suivre (car il permet paresseux itérateurs, etc.). Vous n'avez pas de soins où l'itérateur est à venir, afin de ne pas limiter plus que vous devez.

4voto

starblue Points 29696

Certains constructeurs, par exemple, ArrayList(Collection c), utilisez la méthode toArray() de Collecte pour l'efficacité.

2voto

Patrick McDonald Points 20645

Si vous allez pour la Collecte, votre classe peut être initialisé à partir d'une collection seulement, si vous allez pour Itératif, alors vous pouvez initialiser à partir soit de collection ou itératif.

Comme l'effort et la performance pour les deux est le même, il est logique d'accepter Itératif dans le constructeur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X