Страницы

Поиск по вопросам

суббота, 30 ноября 2019 г.

Зачем в Java 2 интерфейса: Iterable и Iterator?

#java #ооп


По-моему они только вносят путаницу. Я так понял их роли: Iterable говорит что по
объектам класса в принципе можно итерироваться, а Iterator задает сами методы для итерирования.
Но по-моему все это отлично смотрелось бы в одном интерфейсе. Который и объявлял бы
класс итерируемым и одновременно задавал бы методы для итерирования.
    


Ответы

Ответ 1



Можно было бы об этом задуматься, если предполагаемое соответствие Iterable и его Iterator было "один к одному". Но дело обстоит иначе: Iterable может в некий момент обходиться несколькими Iterator сразу (возможно, ещё и в разных thread'ах!). То есть, это интерфейсы, представляющие две разных сущности: коллекцию и обход коллекции. Уже поэтому стоит их разделить, поскольку в противном случае для нескольких параллельных обходов коллекция должна быть всегда завёрнута в итератор и иметь два вида копирования (для итератора и для коллекции), а тут уже просматривается явное нарушение SRP (Single Responsibility Principle, принципа единственной обязанности).

Ответ 2



Один - тот кто ездит. Это Iterator Другой - тот на ком ездят. Это Iterable Первый не возможен без Второго. Второй возможен без первого, но бесполезен. А на самом деле Iterable - всего лишь способ задать стандартный механизм извлечения итератора. Он не является таким уж важным в деле итерации. Он не нужен совсем. Например у List есть ещё listIterator, к которому Iterable вообще никакого отношения не имеет. но тем не менее это настоящий итератор и даже упруженный дополнительными возможностями.

Ответ 3



... все это отлично смотрелось бы в одном интерфейсе Не смотрелось бы. Iterator — это интерфейс. То есть мы можем вызвать метод какого-то класса, передать ему итератор и как бы сказать: «вот тебе некая последовательность, пробегись-ка по ней и сделай ряд действий». Благодаря абстрактности итератор может быть вообще не привязан ни к какой коллекции, а самостоятельно генерировать значения на лету! Причём эти действия, связанные с последовательным проходом по элементам, одинаковы для любого типа контейнера. Но даже если считать, что любой итератор завязан на своём контейнере, то всё равно получается нехорошо. Итератор — это вспомогательная сущность, состояние которой надо хранить. Плюс, как правильно заметил @D-side, итератор даже уровне восприятия является отдельной сущностью.

Комментариев нет:

Отправить комментарий