Зачем писать такой итератор? - PullRequest
1 голос
/ 16 декабря 2009

Я читал учебник по Java для внутреннего класса

http://java.sun.com/docs/books/tutorial/java/javaOO/innerclasses.html

Это объясняет это в примере «Внутренний класс InnerEvenIterator, который похож на стандартный итератор Java». Итак, я так понимаю, что итераторы довольно распространены в Java?

Я пришел из программирования на Си. Я не понимаю, почему такая простая петля

for(i=0;i <SIZE;i+2){
System.System.out.println(arrayOfInts[i]));
}

расширен до итераторов (внутренний класс) с двумя методами. Какой тут смысл?

public class DataStructure {
    //create an array
    private final static int SIZE = 15;
    private int[] arrayOfInts = new int[SIZE];

    public DataStructure() {
        //fill the array with ascending integer values
        for (int i = 0; i < SIZE; i++) {
            arrayOfInts[i] = i;
        }
    }

    public void printEven() {
        //print out values of even indices of the array
        InnerEvenIterator iterator = this.new InnerEvenIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.getNext() + " ");
        }
    }

//inner class implements the Iterator pattern
    private class InnerEvenIterator {
        //start stepping through the array from the beginning
        private int next = 0;

        public boolean hasNext() {
            //check if a current element is the last in the array
            return (next <= SIZE - 1);
        }

        public int getNext() {
            //record a value of an even index of the array
            int retValue = arrayOfInts[next];
            //get the next even element
            next += 2;
            return retValue;
        }
    }

    public static void main(String s[]) {
        //fill the array with integer values and print out only values of even indices
        DataStructure ds = new DataStructure();
        ds.printEven();
    }
}

Ответы [ 5 ]

6 голосов
/ 16 декабря 2009

Для простых циклов над массивами вы (обычно) не используете Iterator в Java.

for(int i=0;i < arrayOfInts.length ; i+2){
     System.out.println(arrayOfInts[i]));
}

Идея итератора состоит в том, чтобы отделить способ хранения данных (может быть не массив) от их потребителя (код, который хочет перебрать его).

Вы правы, когда говорите, что Iterator является довольно базовой концепцией в библиотеке классов Java, настолько распространенной, что начиная с Java5 существует функция для каждого языка петель для ее поддержки. С помощью этого цикла пользователь даже не видит итератор.

for(Something element: listOfSomething){
    System.out.println(element);
}

Если бы я реализовал «итератор с четным шагом», я бы основывал его на обычном итераторе, чтобы его можно было использовать с любым типом итерации.

public class EvenSteppingIterator<X> implements Iterator<X>{

      private final Iterator<X> source;

      public EvenSteppingIterator(Iterator<X> source){
          this.source = source;
          // skip the first one, start from the second
          if (source.hasNext()) source.next();
      }

      public boolean hasNext() {
          return source.hasNext();
      }

      public X next(){
          X n = source.next();
          // skip the next one
          if (source.hasNext()) source.next();
          return n;
      }


}
3 голосов
/ 16 декабря 2009

Итераторы - это абстракция. Абстракции обычно хороши.

Одна хорошая вещь (большая вещь?), Которую получают итераторы, - это возможность исследовать различные структуры данных единообразным способом, даже если структура данных не может быть проиндексирована целым числом. Например, в C ++ вы можете использовать итераторы для работы с массивами, наборами, векторами, картами и даже вашими собственными структурами данных, причем все концептуально и синтаксически единообразно. Даже если карта оказывается из строк в виджеты!

При использовании подхода C ++ использование итераторов всегда будет по меньшей мере столь же эффективным, как и использование любого другого механизма доступа. У Java разные приоритеты. Стивен прав, что пример кода из учебника по Java, вероятно, не является хорошим примером того, почему вы хотите использовать итераторы.

3 голосов
/ 16 декабря 2009

Это иллюстрация внутренних классов, а не пример наиболее подходящего использования итераторов.

Далее вы будете жаловаться, что программы "hello world" не делают ничего полезного!

1 голос
/ 16 декабря 2009

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

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

Кстати: добро пожаловать на Java!

Приветствия

Mike

0 голосов
/ 16 декабря 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...