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

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

Жанры

Философия Java3

Эккель Брюс

Шрифт:

public class CoffeeGenerator

implements Generator<Coffee>, Iterable<Coffee> {

private Class[] types = { Latte class. Mocha.class.

Cappuccino class, Americano.class. Breve class. }; private static Random rand = new Random(47); public CoffeeGeneratorО {} //Для перебора-private int size = 0.

public CoffeeGenerator(int sz) { size = sz;' } public Coffee next О { try {

return (Coffee)

types[rand nextInt(types.length)] newlnstance. // Сообщение об ошибках во время выполнения: } catch(Exception е) {

'throw new RuntimeException(e);

}

}

class Coffeelterator implements Iterator<Coffee> { int count = size;

public boolean hasNextO { return count > 0. } public Coffee next О { count--;

return CoffeeGenerator.this.next.

}

public void removeO { // He реализован

throw new UnsupportedOperationExceptionO;

}

}:

public Iterator<Coffee> iteratorO { return new CoffeeIterator;

}

public static void main(String[] args) {

CoffeeGenerator gen = new CoffeeGenerator; for (int i =0. i <5; i++)

System.out println(gen.nextO); for(Coffee с : new CoffeeGenerator(5)) System.out println(c),

}

} /* Output-Americano 0 Latte 1

Americano 2 продолжение &

Mocha 3 Mocha 4 Breve 5 Americano 6 Latte 7 Cappuccino 8 Cappuccino 9 *///:-

Параметризованный интерфейс Generator гарантирует, что next вернет параметр типа. CoffeeGenerator также реализует интерфейс Iterable и поэтому может использоваться в синтаксисе foreach. Аргумент, по которому определяется момент прекращения перебора, передается при вызове второго конструктора.

А вот как выглядит другая реализация Generator<T>, предназначенная для получения чисел Фибоначчи:

//. generics/Fibonacci java // Построение чисел Фибоначчи import net mindview util *;

public class Fibonacci implements Generator<Integer> { private int count = 0;

public Integer nextO { return fib(count++); } private int fibCint n) {

if(n < 2) return 1, return fib(n-2) + fib(n-l),

}

public static void main(String[] args) { Fibonacci gen = new Fibonacci; for(int i = 0; i < 18: i++)

System.out.print(gen.nextО + " ");

}

} /* Output-

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 *///:-

Хотя и внутри, и снаружи класса мы работаем с int, в параметре типа передается Integer. В этом проявляется одно из ограничений параметризации в языке Java: примитивные типы не могут использоваться в качестве параметров типа. Впрочем, в Java SE5 была добавлена удобная автоматическая упаковка (распаковка) для перехода от примитивных типов к объектным «оберткам», и наоборот.

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

Существует несколько вариантов реализации адаптеров. Например, для получения адаптируемого класса можно воспользоваться наследованием:

//: generi cs/IterableFi bonacci.java

// Adapt the Fibonacci class to make it Iterable.

import java.util.*;

public class IterableFibonacci

extends Fibonacci implements Iterable<Integer> { private int n;

public IterableFibonacci(int count) { n = count; } public Iterator<Integer> iteratorO {

return new Iterator<Integer>0 {

public boolean hasNextO { return n > 0; } public Integer next О { n- -;

return Iterabl eFibonacci .this nextO.

}

public void removeO { // He реализован

throw new UnsupportedOperationExceptionO;

}

}:

}

public static void main(String[] args) {

for(int i . new IterableFibonacci(18)) System out printO + " ");

}

} /* Output-

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584

*///.-

Для использования IterableFibonacci в синтаксисе foreach мы передаем конструктору границу, чтобы метод hasNext знал, когда следует возвращать false.

Параметризованные методы

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

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

Чтобы определить параметризованный метод, следует указать список параметров перед возвращаемым значением:

//• generics/GenericMethods.java

public class GenericMethods { public <T> void f(T x) {

System out println(x.getClass.getNameO);

}

public static void main(String[] args) {

GenericMethods gm = new GenericMethodsО,

gm.f(""); продолжение &

gm f(l); gm.f(l.O); gm.f(l.OF); gm f('c'); gm.f(gm);

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

Ненаглядная жена его светлости

Зика Натаэль
Любовные романы:
любовно-фантастические романы
6.23
рейтинг книги
Ненаглядная жена его светлости

Тринадцатый VIII

NikL
8. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VIII

Страж Кодекса. Книга II

Романов Илья Николаевич
2. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга II

Крестоносец

Ланцов Михаил Алексеевич
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Крестоносец

Горячий старт. Часть 3

Глазачев Георгий
3. Бесконечная Империя Вечности
Фантастика:
фэнтези
рпг
попаданцы
5.00
рейтинг книги
Горячий старт. Часть 3

Потомок бога 3

Решетов Евгений Валерьевич
3. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Потомок бога 3

Здравствуй, 1985-й

Иванов Дмитрий
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Здравствуй, 1985-й

Кодекс Императора III

Сапфир Олег
3. Кодекс Императора
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Императора III

Антимаг

Гедеон Александр и Евгения
1. Антимаг
Фантастика:
фэнтези
6.95
рейтинг книги
Антимаг

Кодекс Охотника. Книга XXIII

Винокуров Юрий
23. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXIII

Найденыш

Шмаков Алексей Семенович
2. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Найденыш

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

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

Хозяин Стужи 2

Петров Максим Николаевич
2. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.75
рейтинг книги
Хозяин Стужи 2

Запасная дочь

Зика Натаэль
Фантастика:
фэнтези
6.40
рейтинг книги
Запасная дочь