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

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

Жанры

Философия 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);

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

Американский таблоид

Эллрой Джеймс
Детективы:
крутой детектив
7.17
рейтинг книги
Американский таблоид

Война с саламандрами (сборник)

Чапек Карел
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
Война с саламандрами (сборник)

Антарктида: Четвертый рейх

Сушинский Богдан Иванович
Секретный фарватер
Фантастика:
альтернативная история
5.33
рейтинг книги
Антарктида: Четвертый рейх

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

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

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

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

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

Индийская философия (Том 1)

Радхакришнан Сарвепалли
Научно-образовательная:
философия
5.00
рейтинг книги
Индийская философия (Том 1)

Человек с кошкой

Faster
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
5.00
рейтинг книги
Человек с кошкой

Михаил Федорович

Сахаров Андрей Николаевич
3. Романовы. Династия в романах
Проза:
историческая проза
6.40
рейтинг книги
Михаил Федорович

Пламенев. Книга IX

Карелин Сергей Витальевич
9. Пламенев
Фантастика:
аниме
уся
сказочная фантастика
фэнтези
фантастика: прочее
5.00
рейтинг книги
Пламенев. Книга IX

Разведчики времени

Асприн Роберт Линн
1. Вокзал времени
Фантастика:
боевая фантастика
8.83
рейтинг книги
Разведчики времени

Экспансия (сборник)

Басов Николай Владленович
Шедевры отечественной фантастики
Фантастика:
научная фантастика
5.00
рейтинг книги
Экспансия (сборник)

Записки брюнетки

Голубицкая Жанна
Проза:
современная проза
4.25
рейтинг книги
Записки брюнетки

Полуденный бриз

Самылов Алексей Леонидович
4. Эриминум
Фантастика:
фэнтези
6.83
рейтинг книги
Полуденный бриз