Чтение онлайн

на главную - закладки

Жанры

Философия Java3

Эккель Брюс

Шрифт:

Обе версии display работают как с объектами Map, так и с подтипами Collection; при этом как Collection, так и Iterator изолируют методы display от знания конкретной реализации используемого контейнера.

В данном случае два решения примерно равноценны. Использование Iterator становится предпочтительным при реализации постороннего класса, для которого реализация интерфейса Collection затруднена или нежелательна. Например, если мы создаем реализацию Collection наследованием от класса, содержащего объекты Pet, нам придется реализовать все методы Collection,

даже если они не будут использоваться в методе display. Хотя проблема легко решается наследованием от AbstractCollection, вам все равно придется реализовать iterator вместе с size, чтобы предоставить методы, не реализованные AbstractCollection, но используемые другими методами AbstractCollection:

// • hoidi ng/Col1ecti onSequence.java import typeinfo pets.*; import java.util.*;

public class CollectionSequence extends AbstractCollection<Pet> {

private Pet[] pets = Pets.createArray(8); public int sizeO { return pets.length; } public Iterator<Pet> iteratorO {

return new Iterator<Pet> {

private int index = 0; public boolean hasNextO. {

return index < pets.length;

public Pet nextО { return pets[index++]; } public void removeО { // He реализован

throw new UnsupportedOperationExceptionO;

}

}:

}

public static void main(String[] args) {

CollectionSequence с = new Col 1ectionSequence; InterfaceVsIterator.di splay(с); InterfaceVsIterator.di splay(c.i terator);

}

} /* Output:

0:Rat l:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 0:Rat l:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx *///:-

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

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

//: hoidi ng/NonCol1ecti onSequence.java import typeinfo.pets.*; import java.util.*;

class PetSequence {

protected Pet[] pets = Pets.createArray(8);

}

public class NonCollectionSequence extends PetSequence { public Iterator<Pet> iteratorO {

return new Iterator<Pet> {

private int index = 0; public boolean hasNextO {

return index < pets length;

}

public Pet nextO { return pets[index++]; } public void removeO { // He реализован

throw new UnsupportedOperationExceptionO;

}

}:

}

public static void main(String[] args) {

NonCollectionSequence nc = new NonCollectionSequence; InterfaceVsIterator.display(nc.iteratorO);

}

} /* Output:

0:Rat l:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx *///:-

Создание Iterator

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

Синтаксис foreach и итераторы

До настоящего момента «синтаксис foreach» использовался в основном с массивами, но он также будет работать с любым объектом Collection. Некоторые примеры уже встречались нам при работе с ArrayList, но можно привести и более общее подтверждение:

//: holding/ForEachCollections java

// Синтаксис foreach работает с любыми коллекциями

import java.util.*,

public class ForEachCollections {

public static void main(String[] args) {

Collection<String> cs = new LinkedList<String>; Col lections.addAl1(cs,

"Take the long way home".splitC' ")); for(String s : cs)

System, out. pri nt(..... + s + .....),

}

} /* Output-

'Take' 'the' 'long' 'way' 'home' *///:-

Поскольку cs является Collection, этот пример показывает, что поддержка foreach является характеристикой всех объектов Collection.

Работа этой конструкции объясняется тем, что в Java SE5 появился новый интерфейс Iterable, который содержит метод iterator для создания Iterator, и именно интерфейс Iterable используется при переборе последовательности в синтаксисе foreach. Следовательно, создав любой класс, реализующий Iterable, вы сможете использовать его в синтаксисе foreach:

//: hoidi ng/IterableClass.java // Anything Iterable works with foreach. import java.util.*;

public class IterableClass implements Iterable<String> { protected StringE] words = ("And that is how " +

"we know the Earth to be banana-shaped.").splitC "); public Iterator<String> iteratorO {

return new Iterator<String> { private int index = 0; public boolean hasNextO {

return index < words length;

}

public String nextO { return words[index++]; } public void remove0 { // Not implemented

throw new UnsupportedOperationExceptionO,

};

public static void main(Stnng[] args) {

for(String s • new IterableClassO) System out print(s + " ");

}

} /* Output.

And that is how we know the Earth to be banana-shaped. *///:-

Метод iterator возвращает экземпляр анонимной внутренней реализации Iterator<string>, последовательно доставляющей каждое слово в массиве. В main мы видим, что IterableClass действительно работает в синтаксисе foreach.

В Java SE5 многие классы реализуют Iterable, прежде всего все классы Collection (но не Map). Например, следующий код выводит все переменные окружения (environment) операционной системы:

Поделиться:
Популярные книги

Бастард Императора. Том 14

Орлов Андрей Юрьевич
14. Бастард Императора
Фантастика:
городское фэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Бастард Императора. Том 14

Звездная Кровь. Экзарх III

Рокотов Алексей
3. Экзарх
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Экзарх III

Дважды одаренный. Том IV

Тарс Элиан
4. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
7.00
рейтинг книги
Дважды одаренный. Том IV

Неучтенный элемент. Том 8

NikL
8. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 8

Убийца

Бубела Олег Николаевич
3. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Убийца

Оживший камень

Кас Маркус
1. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Оживший камень

Кодекс Крови. Книга IХ

Борзых М.
9. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IХ

Изгой Проклятого Клана. Том 5

Пламенев Владимир
5. Изгой
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 5

Законы Рода. Том 8

Мельник Андрей
8. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 8

Лекарь Империи 4

Карелин Сергей Витальевич
4. Лекарь Империи
Фантастика:
городское фэнтези
аниме
попаданцы
5.00
рейтинг книги
Лекарь Империи 4

Князь Целитель 4

Ткачев Андрей Юрьевич
4. Князь Целитель
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Князь Целитель 4

Имперец. Том 3

Романов Михаил Яковлевич
2. Имперец
Фантастика:
боевая фантастика
попаданцы
альтернативная история
7.43
рейтинг книги
Имперец. Том 3

Тыл-фронт

Головин Андрей
Проза:
военная проза
проза прочее
5.00
рейтинг книги
Тыл-фронт

Старый, но крепкий 8

Крынов Макс
8. Культивация без насилия
Фантастика:
рпг
уся
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Старый, но крепкий 8