Pourquoi ne sont pas les Énumérations Itératif?
En Java 5 et au-dessus vous avez la boucle foreach, qui fonctionne comme par magie sur tout ce qui met en œuvre Iterable
:
for (Object o : list) {
doStuff(o);
}
Cependant, Enumerable
encore ne pas mettre en œuvre Iterable
, ce qui signifie que pour effectuer une itération sur un Enumeration
vous devez effectuer les opérations suivantes:
for(; e.hasMoreElements() ;) {
doStuff(e.nextElement());
}
Personne ne sait si il ya une raison pourquoi Enumeration
encore ne pas mettre en œuvre Iterable
?
Edit: Que d'une clarification, je ne parle pas la langue notion de enum, je parle un Java-classe spécifique dans l'API Java appelé"L'énumération'.
- Ne pourrait-il pas être doStuff(e.nextElement()) à l'intérieur du bloc?
Vous devez vous connecter pour publier un commentaire.
Énumération n'a pas été modifié à l'appui de Itérable parce que c'est une interface pas une classe concrète (comme le Vecteur, qui a été modifié pour supporter les Collections de l'interface).
Si Énumération a été modifié pour prendre en charge Itérable elle allait se briser un tas de gens du code.
Enumeration
à base deIterable
. Il n'y a rien de "réparer";Enumeration
etIterable
ne sont pas logiquement équivalent types, et un utilitaire de conversion correctement combler l'écart entre eux est déjà fourni dansCollections.list()
Comme un facile et propre façon d'utiliser une Énumération avec le renforcement de la boucle for, de le convertir à une liste de tableaux avec java.util.Les Collections.liste.
(javax.swing.table.TableColumnModel.getColumns retourne une Énumération.)
Remarque, c'est peut-être très légèrement moins efficace.
Il ne fait pas de sens pour
Enumeration
à mettre en œuvreIterable
.Iterable
est une méthode de fabrique pourIterator
.Enumeration
est analogue àIterator
, et seulement maintient l'état pour une simple énumération.Alors, soyez prudent d'essayer d'envelopper un
Enumeration
comme unIterable
. Si quelqu'un me passe unIterable
, je suppose que je peux appeleriterator()
sur elle à plusieurs reprises, créant autant deIterator
instances que je veux, et l'itération de façon indépendante sur chaque. Un enveloppéEnumeration
ne respecte pas ce contrat; ne laissez pas votre enveloppéEnumeration
échapper à partir de votre propre code. (En aparté, j'ai remarqué que Java 7DirectoryStream
viole les attentes de cette manière, et ne devrait pas être autorisé à "s'échapper", soit.)Enumeration
est comme unIterator
, pas unIterable
. UnCollection
estIterable
. UnIterator
ne l'est pas.Vous ne pouvez pas faire ceci:
Donc il ne serait pas logique pour ce faire:
Il n'y a pas de
Enumerable
équivalent àIterable
. Il peut être ajouté sans casser quoi que ce soit pour travailler dans les boucles for, mais à quoi servirait-il? Si vous êtes en mesure de mettre en œuvre cette nouvelleEnumerable
interface, pourquoi ne pas simplement mettre en œuvreIterable
à la place?Autant que je sache, l'Énumération est un peu "obsolète":
J'espère qu'ils vont changer la Servlet API JSR 315 à utiliser l'Itérateur à la place de l'Énumération.
Si vous souhaitez juste à être syntaxiquement un peu plus propre, vous pouvez utiliser: