Domanda

In Java 5 e, soprattutto, si ha il ciclo foreach, che funziona magicamente su qualcosa che implementa Iterable:

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

Tuttavia, Enumerable ancora non implementa Iterable, il che significa che per iterare un Enumeration è necessario effettuare le seguenti operazioni:

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

Qualcuno sa se c'è un motivo Enumeration ancora non implementa Iterable?

Edit: Un chiarimento, non sto parlando del concetto di linguaggio di un enum, Sto parlando di un Java-specifica classe in Java API denominata 'Enumerazione'.

È stato utile?

Soluzione

L'enumerazione non è stato modificato per supportare Iterable perché è un'interfaccia non un calcestruzzo di classe (come Vector, che è stata modificata per supportare le Collezioni di interfaccia).

Se l'Enumerazione è stato modificato per supportare Iterable sarebbe interruzione di un gruppo di persone del codice.

Altri suggerimenti

Come un facile e pulire modo di utilizzo di un'Enumerazione dal miglioramento del ciclo for, la conversione di un ArrayList con java.util.Collezioni.elenco.

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

(javax.swing.tabella.TableColumnModel.getColumns restituisce Enumerazione.)

Nota bene, questo può essere leggermente meno efficiente.

Non ha senso per Enumeration per implementare Iterable. Iterable è un metodo factory per Iterator. Enumeration analoga è la Iterator, e solo mantiene lo stato per una sola enumerazione.

Quindi, essere attenti cercando di avvolgere un Enumeration come Iterable.Se qualcuno mi passa un Iterable, Si darà per scontato che posso chiamare iterator() su di esso più volte, creazione di un numero di Iterator casi come voglio, e innovare in modo indipendente su ogni.Una avvolto Enumeration non adempiere a questo contratto;non lasciate che il vostro avvolto Enumeration fuga dal proprio codice.(Per inciso, ho notato che Java 7 DirectoryStream viola le aspettative proprio in questo modo, e non dovrebbe essere consentito di "fuga" sia).

Enumeration è come un Iterator, non un Iterable.Un Collection è Iterable.Un Iterator non è.

Non si può fare questo:

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

Quindi non avrebbe senso fare questo:

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

Non c'è Enumerable equivalente per Iterable.Può essere aggiunto senza rompere nulla su cui lavorare per cicli, ma quale sarebbe il punto?Se siete in grado di implementare questa nuova Enumerable interfaccia, perché non implementare Iterable invece?

AFAIK Enumerazione è kinda "deprecato":

Iteratore prende il posto di Enumerazione in Java collezioni quadro

Spero che cambieranno la Servlet API JSR 315 utilizzare Iteratore invece di Enumerazione.

Se vorrei solo essere sintatticamente un po ' più pulito, è possibile utilizzare:

while(e.hasMoreElements()) {
  doStuff(e.nextElement());
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top