Каковы преимущества интерфейса Iterator в Java?

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

35
задан Durandal 22 February 2014 в 22:09
поделиться

15 ответов

, Почему это - используемый интерфейс?

, поскольку это поддерживает основные операции, которые позволили бы клиентскому программисту выполнять итерации по любому виду набора (примечание: не обязательно Collection в эти Object смысл).

, Почему методы... непосредственно не кодируются к самой реализации структуры данных?

Они, они просто отмечены Частные, таким образом, Вы не можете достигнуть их и унавозить с ними. Более конкретно:

  • можно реализовать или разделить на подклассы Iterator таким образом, что это делает что-то, что стандартные не делают, не имея необходимость изменять фактический объект, которого это выполняет итерации.
  • Объектам, которые могут быть пересечены, не должны были загромождать их интерфейсы с пересекающимися методами, в особенности любыми узкоспециализированными методами.
  • можно раздать Iterators однако многим клиентам, которых Вы желаете, и каждый клиент может пересечь в свободное время на их собственной скорости.
  • Java Iterators от java.util пакета в особенности выдаст исключение, если устройство хранения данных, что спины их изменяются, в то время как Вы все еще имеете Iterator. Это исключение сообщает, что эти Iterator может теперь возвращать недопустимые объекты.

Для простых программ, ни одно из этого, вероятно, не кажется стоящим. Вид сложности, которая делает их полезными, подойдет на Вас быстро, все же.

18
ответ дан Dustman 27 November 2019 в 15:40
поделиться

Итератор полезен, когда Вы имеете дело с Наборами в Java.

Использование Для - Каждый цикл (Java1.5) для итерации по набору или массиву или списку.

0
ответ дан amadamala 27 November 2019 в 15:40
поделиться

Итераторы могут использоваться против любого вида набора. Они позволяют Вам определять алгоритм против набора объектов независимо от конкретной реализации. Это означает, что можно обработать Список, Набор, Строку, Файл, Массив, и т.д.

Десять лет с этого времени можно изменить Реализацию списка на лучшую реализацию, и алгоритм будет все еще работать беспрепятственно против него.

0
ответ дан Gili 27 November 2019 в 15:40
поделиться

Итераторы являются одним из многих шаблонов разработки, доступных в Java. Шаблоны разработки могут считаться удобными стандартными блоками, стилями, использованием Вашего кода/структуры.

Для чтения больше о шаблоне разработки Итератора проверяют этот веб-сайт, который говорит об Итераторе, а также многих других шаблонах разработки. Вот отрывок от сайта на Итераторе: http://www.patterndepot.com/put/8/Behavioral.html

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

0
ответ дан zxcv 27 November 2019 в 15:40
поделиться

Итератор просто добавляет распространенный способ пробежаться через набор объектов. Одной из хороших функций является i.remove (), в котором можно удалить элементы из списка, которого Вы выполняете итерации. Если бы Вы просто попытались удалить объекты из списка обычно, то он имел бы странные эффекты или бросок и исключение.

интерфейс похож на контракт для всех вещей, которые реализуют его. Вы в основном говорите.. что-либо, что реализует итератор, как гарантируют, будет иметь эти методы, которые ведут себя тот же путь. Можно также использовать его для раздавания типов итератора, если это - все, с чем Вы заботитесь о контакте в Вашем коде. (Вы не могли бы заботиться, какой список это.. Вы просто хотите передать Итератор), Вы могли поместить все эти методы независимо в наборы, но Вы не гарантируете, что они ведут себя то же или что у них даже есть то же имя и подписи.

0
ответ дан Arthur Thomas 27 November 2019 в 15:40
поделиться

В конечном счете, потому что Итератор получает абстракцию управления, которая применима к большому количеству структур данных. Если Вы бодрствуете на своей теории категорий fu, можно было унести ум данная статья: Сущность Шаблона Итератора .

1
ответ дан Apocalisp 27 November 2019 в 15:40
поделиться

Просто M2C, если Вы не знали: можно постараться не непосредственно использовать интерфейс итератора в ситуациях, где для - каждый цикл будет достаточен.

1
ответ дан chickeninabiscuit 27 November 2019 в 15:40
поделиться

Хорошо кажется, что первый пункт маркированного списка допускает многопоточный (или единственный распараллелил, если Вы завинчиваете), приложения для не блокировки набора для нарушений параллелизма. В.NET, например, Вы не можете перечислить и изменить набор (или список или любой IEnumerable) одновременно, не блокируя или наследовавшись IEnumerable и методам переопределения (мы получаем исключения).

0
ответ дан Jason Punyon 27 November 2019 в 15:40
поделиться

Интересная статья, обсуждая за и против использования итераторов:

http://www.sei.cmu.edu/pacc/CBSE5/Sridhar-cbse5-final.pdf

1
ответ дан user11087 27 November 2019 в 15:40
поделиться

Поскольку можно выполнять итерации по чему-то, что это не структура данных. Скажем, у меня есть сетевое приложение, которое вытягивает результаты сервера. Я могу возвратить обертку Итератора вокруг тех результатов, и передают их потоком через любой стандартный код, который принимает объект Итератора.

Думают о нем как о ключевой роли хорошего дизайна MVC. Данные должны добраться из Модели (т.е. структура данных) к Представлению так или иначе. Используя Итератор, поскольку посредник удостоверяется, что реализация Модели никогда не представляется. Вы могли сохранять LinkedList в памяти, вытаскивая информацию из алгоритма дешифрования, или обертывая вызовы JDBC. Это просто не имеет значения для представления, потому что представление только заботится об интерфейсе Iterator.

2
ответ дан 64BitBob 27 November 2019 в 15:40
поделиться

Несколько экземпляров interator могут использоваться одновременно. Приблизьтесь к ним как к локальным курсорам для базовых данных.

BTW: одобрение интерфейсов по конкретным реализациям освобождает связь

, Ищут шаблон разработки итератора, и здесь: http://en.wikipedia.org/wiki/Iterator

3
ответ дан Daniel Hiller 27 November 2019 в 15:40
поделиться

Используя эти Iterator интерфейс позволяет любой класс, который реализует его методы для действия как итераторы. Понятие интерфейса в Java должно иметь, в некотором смысле, договорное обязательство обеспечить определенные технические возможности в классе, что implements интерфейс, для действия способом, который требуется интерфейсом. Так как договорные обязательства должны быть выполнены, чтобы быть допустимым классом, другие классы, которые видят класс implements интерфейс и таким образом заверенный, чтобы знать, что класс будет иметь те определенные технические возможности.

В этом примере, вместо того, чтобы реализовать методы (hasNext(), next(), remove()) в LinkedList сам класс, LinkedList класс объявит, что это implements эти Iterator интерфейс, таким образом, другие знают, что эти LinkedList может использоваться в качестве итератора. В свою очередь LinkedList класс реализует методы от Iterator интерфейс (такой как [1 111]), таким образом, это сможет функционировать как итератор.

, Другими словами, реализовывая интерфейс понятие объектно-ориентированного программирования, чтобы позволить другим знать, что определенный класс имеет то, что он берет, чтобы быть тем, чем он утверждает, что был.

Это понятие осуществляется при наличии методов, которые должны быть реализованы классом, который реализует интерфейс. Это удостоверяется, что другие классы, которые хотят использовать класс, который реализует эти Iterator интерфейс, что это будет действительно иметь методы, которые Итераторы должны иметь, такой как [1 113].

кроме того, нужно отметить, что, так как Java не имеет множественного наследования, использование интерфейса может использоваться для эмуляции той функции. Путем реализации нескольких интерфейсов можно иметь класс, который является подклассом, чтобы наследовать некоторые функции, все же также "наследовать" функции другого путем реализации интерфейса. Один пример был бы, если бы я хотел иметь подкласс LinkedList класс, названный ReversibleLinkedList, который мог бы выполнить итерации в обратном порядке, я могу создать интерфейс, названный ReverseIterator, и осуществить это, это обеспечивает previous() метод. Начиная с LinkedList уже реализации Iterator, новый обратимый список реализовал бы и Iterator и ReverseIterator интерфейсы.

можно ли считать больше об интерфейсах от [1 122], Что такое Интерфейс? из Учебного руководства по Java от Sun.

3
ответ дан coobird 27 November 2019 в 15:40
поделиться

важно сохранить набор кроме указателя. точки итератора в определенном месте в наборе, и таким образом не являются неотъемлемой частью набора. этот путь, для экземпляра, можно использовать несколько итераторов по тому же набору.

оборотная сторона этого разделения - то, что итератор не знает к изменениям, внесенным в набор, на котором это выполняет итерации. таким образом, Вы не можете изменить структуру набора и ожидать, что итератор продолжится, это - работа без "жалоб".

4
ответ дан Amir Arad 27 November 2019 в 15:40
поделиться

Вы спрашиваете: "Почему методы hasNext (), затем () и удаляют () не непосредственно кодированный к самой реализации структуры данных?".

платформа Наборов Java принимает решение определить интерфейс Iterator, как воплощено к самому набору. Обычно, так как каждый набор Java реализует эти Iterable интерфейс, программа Java будет звонить iterator для создания ее собственного итератора так, чтобы это могло использоваться в цикле. Как другие указали, Java 5 позволяет нам прямому использованию итератора с циклом foreach.

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

В классической книге GoF, контраст между внутренними и внешними итераторами разъяснен вполне ясно.

основная проблема А решает, какая сторона conrols повторение, итератор или клиент, который использует итератор. Когда клиент управляет повторением, итератор называют внешним итератором, и когда итератор управляет им, итератор является внутренним итератором. Клиенты, которые используют внешний итератор, должны усовершенствовать обход и запросить следующий элемент явно от итератора. Напротив, клиент вручает внутреннему итератору операцию для выполнения, и итератор применяет ту операцию к каждому элементу....

Внешние итераторы более гибки, чем внутренние итераторы. Легко сравнить два набора для равенства с внешним итератором, например, но это практически невозможно с внутренними итераторами... Но с другой стороны, внутренние итераторы легче использовать, потому что они определяют итеративную логику для Вас.

Для примера того, как внутренние итераторы работают, посмотрите Ruby Enumerable API, который имеет внутренние итеративные методы такой как each. В Ruby идея состоит в том, чтобы передать блок кода (т.е. закрытие) к внутреннему итератору так, чтобы набор мог заботиться о своем собственном повторении.

6
ответ дан Alan 27 November 2019 в 15:40
поделиться

Я думаю, что это - просто хорошая практика OO. У Вас может быть код, который имеет дело со всеми видами итераторов, и даже дает Вам возможность создать Ваши собственные структуры данных или просто универсальные классы, которые реализуют интерфейс итератора. Вы не должны волноваться о том, какая реализация находится позади него.

1
ответ дан Alex Argo 27 November 2019 в 15:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: