Сведения о вопросе

Killer

15:23, 6th August, 2020

Теги

java   enumeration   iterable    

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

Просмотров: 354   Ответов: 5

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

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

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

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

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

Edit: как уточнение, я не говорю о языковой концепции перечисления, я говорю о специфическом классе Java в Java API под названием "перечисление".



  Сведения об ответе

lats

19:10, 25th August, 2020

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

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

(javax.swing.table.TableColumnModel.getColumns возвращает перечисление.)

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


  Сведения об ответе

ASSembler

03:22, 29th August, 2020

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

Поэтому будьте осторожны, пытаясь обернуть Enumeration как Iterable . Если кто-то передаст мне Iterable , я буду считать, что могу вызывать iterator() на нем повторно, создавая столько экземпляров Iterator , сколько захочу, и повторяя независимо друг от друга. Завернутый Enumeration не будет выполнять этот контракт; не позволяйте вашему завернутому Enumeration сбежать из вашего собственного кода. (В качестве отступления я заметил, что Java 7's DirectoryStream нарушает ожидания именно таким образом, и не должно быть позволено "escape" также.)

Enumeration -это как Iterator, а не Iterable . В Collection является Iterable . An 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 вместо этого?


  Сведения об ответе

$DOLLAR

22:28, 2nd August, 2020

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

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


  Сведения об ответе

#hash

00:16, 2nd August, 2020

Насколько мне известно перечисления любопытное "deprecated" :

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

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


  Сведения об ответе

P_S_S

20:38, 25th August, 2020

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться