Почему не Перечисления Iterable?

голоса
58

В Java 5 и выше у вас есть цикл Еогеасп, который работает волшебно на все , что реализует Iterable:

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

Однако, до Enumerableсих пор не реализован Iterable, а это означает , что перебрать Enumerationвы должны сделать следующее:

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

Кто - нибудь знает , если есть причина , почему до Enumerationсих пор не реализованы Iterable?

Edit: В разъяснении, я не говорю о концепции языковой в перечислении , я говорю класс Java-специфический в API Java под названием « Перечень ».

Задан 26/08/2008 в 02:57
источник пользователем
На других языках...                            


5 ответов

голоса
73

Как легко и чистый способ использования перечисления с расширенной цикл, преобразовать в ArrayList с java.util.Collections.list.

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

(Javax.swing.table.TableColumnModel.getColumns возвращает Перечень.)

Обратите внимание, что это может быть очень немного менее эффективно.

Ответил 05/09/2008 в 20:25
источник пользователем

голоса
44

Это не имеет смысла для Enumerationреализовать Iterable. Iterableэто фабричный метод для Iterator. Enumerationаналогично Iterator, и только поддерживает состояние для одного перечисления.

Так что , будьте осторожны , пытаясь обернуть Enumerationкак Iterable. Если кто - то передает мне Iterable, я буду считать , что я могу позвонить iterator()на него несколько раз, создавая столько Iteratorэкземпляров , как я хочу, и итерация независимо друг. Обёрнутый Enumerationне будет выполнять этот контракт; не позволяйте обернутый Enumerationбежать из собственного кода. (Кстати, я заметил , что Java 7 - х DirectoryStreamнарушает ожидания именно таким образом, и не должно быть позволено «бежать» тоже.)

Enumerationподобен Iterator, а не Iterable. CollectionЭто Iterable. IteratorНет.

Вы не можете сделать это:

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

Так что это не имеет смысла, чтобы сделать это:

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

Там не Enumerableсоответствует Iterable. К этому можно добавить , не нарушая ничего , чтобы работать в течение петель, но что бы смысл? Если вы в состоянии реализовать этот новый Enumerableинтерфейс, почему бы не просто реализовать , Iterableа?

Ответил 01/09/2008 в 23:05
источник пользователем

голоса
34

Перечень не был модифицирован для поддержки Iterable потому что интерфейс не класс (как вектор, который был доработан для поддержки интерфейса Collections).

Если перечисление было изменено на поддержку Iterable это нарушило бы кучу коды людей.

Ответил 26/08/2008 в 04:55
источник пользователем

голоса
6

AFAIK перечисление своего рода «устаревшее» :

Итератор занимает место Перечисления в рамках коллекции Java

Я надеюсь, что они будут менять Servlet API с JSR 315, чтобы использовать итератор вместо перечисления.

Ответил 26/08/2008 в 06:17
источник пользователем

голоса
1

Если вы просто хотите, чтобы это было синтаксический немного чище, вы можете использовать:

while(e.hasMoreElements()) {
  doStuff(e.nextElement());
}
Ответил 01/07/2015 в 21:47
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more