Нет смысла для Enumeration
реализовать Iterable
. Iterable
является заводским методом для Iterator
. Enumeration
аналогичен Iterator
и поддерживает состояние только для одного перечисления.
Итак, будьте осторожны, пытаясь обернуть Enumeration
как Iterable
. Если кто-то передаст мне Iterable
, я буду предполагать, что могу неоднократно вызывать iterator()
, создавая столько экземпляров Iterator
, сколько захочу, и независимо повторяя каждый из них. Обернутый Enumeration
не будет выполнять этот контракт; не позволяйте вашему завернутому Enumeration
сбежать из вашего собственного кода. (Кроме того, я заметил, что Java 7 DirectoryStream
нарушает ожидания именно таким образом, и ему также нельзя позволять «сбежать».)
Enumeration
похоже на Iterator
, а не Iterable
. A 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
вместо этого?