Почему перечисления не повторяемы?

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

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

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

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

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

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

вопрос задан 26.08.2008
SCdF
25108 репутация

5 ответов


  • 0 рейтинг

    AFAIK Перечисление своего рода "устарело" :

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

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

    ответ дан dlinsin, с репутацией 10669, 26.08.2008
  • 0 рейтинг

    В качестве простого и удобного чистого способа использования Enumeration с расширенным циклом for конвертируйте его в ArrayList с использованием Java. Util. Коллекции. список.

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

    (Javax. свинг. Таблица. TableColumnModel. getColumns возвращает перечисление. )

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

    ответ дан Tom Hawtin - tackline, с репутацией 123417, 5.09.2008
  • 0 рейтинг

    Для Enumeration не имеет смысла реализовывать Iterable. Iterable - заводской метод для Iterator. Enumeration аналогичен Iterator и поддерживает состояние только для одного перечисления.

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

    Enumeration похож на Iterator, а не на Iterable. Collection Iterable. А Iterator нет.

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

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

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

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

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

    ответ дан erickson, с репутацией 216101, 1.09.2008
  • 0 рейтинг

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

    while(e.hasMoreElements()) {
      doStuff(e.nextElement());
    }
    
    ответ дан user5071455, с репутацией 11, 1.07.2015
  • 0 рейтинг

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

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

    ответ дан Blorgbeard, с репутацией 73365, 26.08.2008