2013-12-08 6 views

ответ

4

Эти два взаимосвязанных, но не одинаковых.

A ListIterable - вы можете получить его Iterator. Это не a Iterator.

Iterator является использование одного класса, который может итерацию вдоль Collection объектов с использованием hasNext и next методы.

Iterable класс Collection, который возвращает экземпляр Iterator, когда вызывается метод iterator().

Я бы зашел так далеко, чтобы сказать, что я вижу no случай, когда Iterable должен implements Iterator. А так как Iterator является одноразовым, я не вижу случая, когда Iterator должен implements Iterable.

+0

'List' имеет' ListIterator', который расширяет 'Iterator'. Так почему: «Это не« Итератор »? – ferrerverck

+0

Список реализует итерацию и имеет внутреннюю реализацию итератора правильно? Меня интересует реализация итератора без повторной реализации. – graviton

+0

@ferrerverck 'List' _returns_ и' Итератор', потому что он 'Итерируемый'. Это, конечно, не «Итератор» - это задача «ListIterator». –

0

Они очень похожи в семантике и прецедентах, но отличаются в реализации. Iterable - простая фабрика для итераторов, которая может использоваться внутри для циклов. По этой причине было бы удобнее реализовать Iterable.

for(String s : getIterable()){ 
    ... 
} 

Versus:

Iterator<String> it = getIterator(); 

while(it.hasNext()){ 
    String s = it.next(); 
    ... 
} 

Однако, в некоторых случаях итератор может не быть повторно инстанцирован, то есть, когда вы работаете через результаты запроса дБ, так что в этом случае вы не можете сделать он Итерируется без повторной отправки вашего запроса.

1

Вообще говоря, вы должны реализовать либо Iterable, либо Iterator, чтобы скрыть реализацию коллекции из кода, который выполняет итерацию по коллекции. Любой из них будет работать хорошо. Разница заключается в том, сколько раз сбор может быть пройден. Итератор может перемещаться только один раз, когда Iterable может пересекать коллекцию много раз. Вы можете пересечь Iterable, запросив его для Iterator, и вы можете сделать это несколько раз.

+0

Итак, знаете ли вы пример, где бы я хотел, чтобы класс реализовал итератор без повторения? Как и в случае, когда было бы необходимо/более полезно только поперечно собирать коллекцию? – graviton

+0

+1. Важной отличительной чертой является повторяемость или ее отсутствие. Рассмотрим строки чтения из сетевого подключения. Это совершенно разумный Итератор, но сделать его Iterable не работает. Что произойдет, если вызывающий абонент вызовет итератор() второй раз? –

Смежные вопросы