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

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

Жанры

Философия Java3

Эккель Брюс

Шрифт:

Is = makeListC"ABCDEFFHIJKLMNOPQRSTUVWXYZ".split("")); System.out.printi n( Is);

}

} /* Output: [A]

[А, В. C]

[, А, В. C. D, E. F, F, H, I, J. K. L, M, N, 0. P. Q, R. S. T. U. V. W. X, Y, Z] *///•-

Метод makeList предоставляет ту же функциональность, что и метод java. util.Arrays.asList из стандартной библиотеки.

Использование параметризованных методов с Generator

Генераторы хорошо подходят для заполнения Collection, и для выполнения этой операции было бы удобно создать параметризованный метод:

//: generics/Genetcitors.java // Обобщенный метод заполнения коллекции import generics.coffee.*; import java.util.*; import net.mindview.util.*;

public class Generators {

public static <T> Collection<T>

fill(Collection<T> coll. Generator<T> gen, int n) { for(int i =0; i < n; i++)

coll .add(gen.nextO); return coll;

}

public static void main(String[] args) { Collection<Coffee> coffee = fill(

new ArrayList<Coffee>. new CoffeeGenerator. 4); for(Coffee с : coffee)

System.out.printin(c); Collection<Integer> fnumbers = fill(

new ArrayList<Integer>, new FibonacciO. 12); for(int i fnumbers)

System.out.printO + \ ");

}

} /* Output: Americano 0 Latte 1 Americano 2 Mocha 3

1. 1. 2. 3. 5. 8. 13. 21. 34. 55. 89. 144. *///:-

Обратите внимание на то, как параметризованный метод fill применяется к контейнерам и генераторам как для типа Coffee, так и для Integer.

Обобщенный генератор

Следующий класс создает генератор для любого класса, обладающего конструктором по умолчанию. Для уменьшения объема кода в него также включен параметризованный метод для получения BasicGenerator:

//: net/mindview/uti1/BasicGenerator java // Автоматическое создание Generator для класса // с конструктором по умолчанию (без аргументов) package net.mindview util;

public class BasicGenerator<T> implements Generator<T> { private Class<T> type;

public BasicGenerator(Class<T> type){ this.type = type; } public T nextО { try {

// Предполагается, что type является public-классом, return type.newlnstance; } catch(Exception e) {

throw new RuntimeException(e);

}

}

// Получение генератора по умолчанию для заданного type: public static <T> Generator<T> create(Class<T> type) { return new BasicGenerator<T>(type).

}

} ///:-

Класс предоставляет базовую реализацию, создающую объекты класса, который (1) является открытым (так как BasicGenerator определяется в отдельном пакете, соответствующий класс должен иметь уровень доступа public, не ограничиваясь пакетным доступом), и (2) обладает конструктором по умолчанию (то есть конструктором без аргументов). Чтобы создать один из таких объектов BasicGenerator, следует вызвать метод create и передать ему обозначение генерируемого типа, параметризованный метод create позволяет использовать запись BasicGenerator.create(MyType.class) вместо более громоздкой конструкции new BasicGenerator<MyType>(MyType.class).

Для примера рассмотрим простой класс с конструктором по умолчанию:

//: generics/CountedObject.java

public class CountedObject {

private static long counter = 0; private final long id = counter++; public long id { return id; }

public String toStringO { return "CountedObject " + id,} } ///:-

Класс CountedObject отслеживает количество созданных экземпляров и включает его в выходные данные toString.

При помощи BasicGenerator можно легко создать Generator для CountedObject:

//: generics/BasicGeneratorDemo java i mport net.mi ndvi ew.uti1.*.

public class BasicGeneratorDemo {

public static void main(String[] args) { Generator<CountedObject> gen =

BasicGenerator create(CountedObject.class), for(int i = 0; i < 5; i++)

System, out pri ntl n(gen. nextO);

}

} /* Output CountedObject 0 CountedObject 1 CountedObject 2 CountedObject 3 CountedObject 4 */// ~

Как видите, применение параметризованного метода снижает объем кода, необходимого для получения объекта Generator. Раз уж механизм параметризации Java все равно заставляет вас передавать объект Class, его можно заодно использовать для вычисления типа в методе create.

Упрощение работы с кортежами

Используя вычисление аргументов типов в сочетании со static-импортом, можно оформить приведенную ранее реализацию кортежей в более универсальную библиотеку. В следующем примере кортежи создаются перегруженным статическим методом:

//• net/mi ndvi ew/uti1/Tuple.java // Библиотека для работы с кортежами // с использованием вычисления аргументов типов package net mindview.util,

public class Tuple {

public static <A,B> TwoTuple<A,B> tuple(A а. В b) { return new TwoTuple<A,B>(a, b).

}

public static <A,B,C> ThreeTuple<A,B,C> tuple(A а. В b. С с) {

return new ThreeTuple<A,B,C>(a, b, c):

}

public static <A,B,C.D> FourTuple<A,B,C.D> tuple(A а. В b. С с. D d) {

return new FourTuple<A,B.C.D>(a. b. c. d).

}

public static <A,B,C.D,E>

FiveTuple<A,B,C,D,E> tuple(A а. В b, С с, D d. E e) {

return new FiveTuple<A,B,C.D,E>(a, b. c. d. e);

}

} ///:-

А вот как выглядит обновленная версия TupleTest.java для тестирования Tuple.java:

//: generics/TupleTest2.java import net.mindview.util.*;

import static net.mindview.util.Tuple.*; продолжение &

public class TupleTest2 {

static TwoTuple<String,Integer> f { return tupleChi", 47);

}

static TwoTuple f2 { return tupleC'hi", 47); } static ThreeTuple<Amphibian,String,Integer> g { return tuple(new AmphibianO, "hi", 47);

}

static

FourTuple<Vehicle,Amphibian,String,Integer> hO {

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

Играть... в тебя

Зайцева Мария
3. Звериные повадки Симоновых
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Играть... в тебя

Старший лейтенант, парень боевой!

Зот Бакалавр
8. Героями не становятся, ими умирают
Фантастика:
боевая фантастика
5.00
рейтинг книги
Старший лейтенант, парень боевой!

На границе империй. Том 7. Часть 3

INDIGO
9. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.40
рейтинг книги
На границе империй. Том 7. Часть 3

Древесный маг Орловского княжества 6

Павлов Игорь Васильевич
6. Орловское княжество
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 6

Неудержимый. Книга XXVI

Боярский Андрей
26. Неудержимый
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга XXVI

Мечников. Из доктора в маги

Алмазов Игорь
1. Жизнь Лекаря с нуля
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Мечников. Из доктора в маги

Древесный маг Орловского княжества

Павлов Игорь Васильевич
1. Орловское княжество
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества

Печать пожирателя 2

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

Ну, здравствуй, перестройка!

Иванов Дмитрий
4. Девяностые
Фантастика:
попаданцы
альтернативная история
6.83
рейтинг книги
Ну, здравствуй, перестройка!

Беглец

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

Ботаник

Щепетнов Евгений Владимирович
1. Ботаник
Фантастика:
фэнтези
боевая фантастика
4.56
рейтинг книги
Ботаник

Газлайтер. Том 31

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

Моя простая курортная жизнь

Блум М.
1. Моя простая курортная жизнь
Проза:
современная проза
5.00
рейтинг книги
Моя простая курортная жизнь

Я все еще князь. Книга XXI

Дрейк Сириус
21. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще князь. Книга XXI