67 votes

Pourquoi les énumérations ne sont-elles pas itérables?

Dans Java 5 et au-dessus vous avez la boucle foreach, qui fonctionne comme par magie sur tout ce qui met en œuvre Itératif:

for (Object o : list) {
  doStuff(o);
}

Cependant, Énumérable encore ne pas mettre en œuvre Itératif, ce qui signifie que de faire une itération sur une Énumération, vous devez effectuer les opérations suivantes:

for(; e.hasMoreElements() ;) {
  doStuff(e.nextElement());
}

Personne ne sait si il ya une raison pourquoi Énumération n'est toujours pas mettre en œuvre Itératif?

Edit: une clarification, je ne parle pas du concept dans la langue d'un enum, je parle un Java-classe spécifique dans l'API Java appelé 'Énumération'.

81voto

Un moyen simple et propre d'utiliser un Enumeration avec l'amélioration de la boucle, se convertir à un ArrayList avec java.util.Collections.list.

 for (TableColumn col : Collections.list(columnModel.getColumns()) {
 

(javax.swing.table.TableColumnModel.getColumns renvoie Enumeration.)

Notez que cela peut être très légèrement moins efficace.

46voto

erickson Points 127945

Il ne fait pas de sens pour Enumeration à mettre en oeuvre Iterable. Iterable est une méthode de fabrique pour Iterator. Enumeration est analogue à l' Iterator, et seulement maintient l'état pour une simple énumération.

Alors, soyez prudent d'essayer d'envelopper un Enumeration comme Iterable. Si quelqu'un me passe un Iterable, je suppose que je peux appeler iterator() sur à plusieurs reprises, créant autant de Iterator 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 s'échapper de votre propre code. (En aparté, j'ai remarqué que Java 7 DirectoryStream viole les attentes de cette manière, et ne devrait pas être autorisé à "s'échapper".)

Enumeration , c'est comme un Iterator, pas un Iterable. Un Collection est Iterable. Un Iterator ne l'est pas.

Vous ne pouvez pas faire ceci:

Vector<X> list = …
Iterator<X> i = list.iterator();
for (X x : i) {
    x.doStuff();
}

Donc il ne serait pas logique pour ce faire:

Vector<X> list = …
Enumeration<X> i = list.enumeration();
for (X x : i) {
    x.doStuff();
}

Il n'y a pas d' 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 ce nouveau Enumerable interface, pourquoi ne pas simplement mettre en oeuvre Iterable à la place?

40voto

Blorgbeard Points 38991

L'énumération n'a pas été modifiée pour prendre en charge Iterable car il s'agit d'une interface et non d'une classe concrète (comme Vector, modifiée pour prendre en charge l'interface Collections).

Si Enumeration était modifié pour prendre en charge Iterable, cela briserait le code de nombreuses personnes.

7voto

dlinsin Points 5863

AFAIK, l'énumération est un peu "obsolète" :

Iterator remplace Enumeration dans le framework de collections Java

J'espère qu'ils changeront l'API Servlet avec JSR 315 pour utiliser Iterator au lieu d'énumération.

1voto

Cristofer Points 11

Dr. Heinz M. Kabutz, spécialiste de Java Numéro 107 , montre un bon moyen de créer une instance Iterable à partir d'une énumération via un adaptateur.

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