Читаем Философия Java3 полностью

'throw new RuntimeException(e);

}

}

class Coffeelterator implements Iterator { 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 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, предназначенная для получения чисел Фибоначчи:

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

public class Fibonacci implements Generator { 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 { private int n;

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

return new Iterator0 {

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 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);

}

} /* Output: java.lang.String java.lang Integer java.lang.Double java.lang.Float java.lang.Character GenericMethods *///:-

Класс GenericMethods не параметризован, хотя и класс, и его методы могут быть параметризованными одновременно. Но в данном случае только метод f() имеет параметр типа, обозначаемый списком параметров перед возвращаемым значением метода.

Перейти на страницу:

Похожие книги

Access 2002: Самоучитель
Access 2002: Самоучитель

В книге рассматривается широкий круг вопросов, связанных с использованием программной среды Access 2002, которая является составной частью пакета Office 2002 и предназначена для создания банка данных в самых различных предметных областях.Подробно описывается методика проектирования объектов базы данных (таблицы, формы, отчеты, страницы доступа к данным, запросы, модули).Детально обсуждаются вопросы создания интегрированной базы данных в единой среде Access 2002: формирование БД с нуля, конвертирование в программную среду баз данных, созданных в ином программном окружении – Clarion, FoxPro.Особое внимание уделяется формированию разнообразных запросов к интегрированной базе данных Access 2002 с использованием языков программирования SQL, VBA и макросов.Приводятся общие сведения о возможностях языка обмена данными между различными компьютерами и приложениями (XML). Описываются возможности использования гиперссылок, связывающих базу данных с другими программными продуктами. Объясняется, как можно работать с базой данных Access 2002 без установки ее на компьютер, используя технологию ODBC (Open Data Base Connectivity). В приложениях приводятся количественные параметры Access 2002 и связанная с этой СУБД терминология.Предлагаемая книга будет полезна специалистам, занимающимся практической разработкой банков данных и приложений на их основе, а также студентам вузов, изучающим информатику.

Павел Юрьевич Дубнов

Программирование, программы, базы данных / ОС и Сети / Книги по IT