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

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

Жанры

Философия Java3

Эккель Брюс

Шрифт:

for(Class<?> с : type.getlnterfacesO) result.add(c.getSimpleName); System.out.println(result);

}

static Set<String> object = methodSet(Object.class); static { object.add("clone"); } static void

differencesass<?> superset, Class<?> subset) {

System.out.pri nt(superset.getSimpleName +

" extends " + subset.getSimpleNameO + ", adds: "); Set<String> comp = Sets.difference(

methodSet(superset). methodSet(subset)); сотр.removeAll(object); // He показывать методы 'Object' System.out.println(comp); interfaces(superset),

}

public static void main(String[] args) {

System.out.printlnC'Collection: " +

methodSet(Collection.class)), interfaces(Collection.class); difference(Set.class. Collection.class); difference(HashSet.class. Set.class); difference(LinkedHashSet.class, HashSet.class); difference(TreeSet.class. Set.class); differences st. class. Col 1 ecti on.cl ass); difference(ArrayList.class, List.class); differences nkedLi st. class. List.class); difference(Queue.class. Collection.class); di fference(Pri ori tyQueue.class. Queue.class); System.out.println("Map: " + methodSet(Map.class)); difference(HashMap.class. Map.class); difference(LinkedHashMap.class. HashMap.class); difference(SortedMap.class. Map.class); difference(TreeMap.class, Map class);

}

} ///:-

Анонимные внутренние классы

Параметризация также может применяться к внутренним классам и анонимным внутренним классам. Пример реализации интерфейса Generator с использованием анонимных внутренних классов:

//: generics/BankTeller.java

II Очень простая имитация банковского обслуживания.

import java.util.*;

import net.mindview.util.*;

class Customer {

private static long counter = 1; private final long id = counter++; private Customer {}

public String toStringO { return "Customer " + id; } // Метод для получения объектов Generator: public static Generator<Customer> generatorO { return new Generator<Customer>

public Customer nextO { return new CustomerO; }

class Teller {

private static long counter = 1; private final long id = counter++; private TellerO {}

public String toStringO { return "Teller " + id; } // Синглетный объект Generator: public static Generator<Teller> generator = new Generator<Teller> {

public Teller next О { return new TellerO; }

}:

}

public class BankTeller {

public static void serve(Teller t, Customer c) {

System.out.printin(t + " обслуживает " + с);

}

public static void main(String[] args) { Random rand = new Random(47); Queue<Customer> line = new LinkedList<Customer>; Generators.fillOine, Customer, generator 0, 15): List<Teller> tellers = new ArrayList<Teller>; Generators.filKtellers, Teller.generator, 4); for(Customer с : line)

serve(tellers.get(rand.nextlnt(tellers.size)), c);

}

} /* Output:

Teller

3

обслуживает

Customer

1

Teller

2

обслуживает

Customer

2

Teller

3

обслуживает

Customer

3

Teller

1

обслуживает

Customer

4

Teller

1

обслуживает

Customer

5

Teller

3

обслуживает

Customer

6

Teller

1

обслуживает

Customer

7

Teller

2

обслуживает

Customer

8

Teller

3

обслуживает

Customer

9

Teller

3

обслуживает

Customer

10

Teller

2

обслуживает

Customer

11

Teller

4

обслуживает

Customer

12

Teller

2

обслуживает

Customer

13

Teller

1

обслуживает

Customer

14

Teller

1

обслуживает

Customer

15

*///•-

И Customer, и Teller содержат приватные конструкторы, поэтому для создания их объектов пользователь вынужден использовать объекты Generator. Customer содержит метод generator, который при каждом вызове создает новый объект Generator<Customer>. На случай, если множественные объекты Generator вам не понадобятся, в Teller создается синглетный открытый объект generator. Оба подхода продемонстрированы в вызовах fill внутри main.

Поскольку метод generator в Customer и объект Generator в Teller являются статическими, они не могут быть частью интерфейса, поэтому «обобщить» эту"

конкретную идиому не удастся. Несмотря на это обстоятельство, она достаточно хорошо работает в методе fill.

Построение сложных моделей

К числу важных преимуществ параметризации относится простота и надежность создания сложных моделей. Например, можно легко создать список (List) с элементами-кортежами:

//: generics/TupleList.java

// Построение сложных параметризованных типов путем объединения

import java.util.*;

import net.mindview util.*;

public class TupleList<A,B.C.D> extends ArrayList<FourTuple<A,B,C.D» {

public static void main(String[] args) {

TupleList<Vehicle, Amphibian. String. Integer> tl =

new TupleList<Vehicle. Amphibian, String. Integer>; tl.add(TupleTest.hO); tl.add(TupleTest.hO):

for(FourTuple<Vehicle.Amphibian.String.Integer> v tl) System.out.println(i);

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

Переиграть войну! Пенталогия

Рыбаков Артем Олегович
Переиграть войну!
Фантастика:
героическая фантастика
альтернативная история
8.25
рейтинг книги
Переиграть войну! Пенталогия

Воин

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

Гримуар темного лорда V

Грехов Тимофей
5. Гримуар темного лорда
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда V

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

Винокуров Юрий
2. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
боевая фантастика
юмористическое фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга II

Сколько стоит любовь

Завгородняя Анна Александровна
Любовные романы:
любовно-фантастические романы
6.22
рейтинг книги
Сколько стоит любовь

Барон не играет по правилам

Ренгач Евгений
1. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон не играет по правилам

Золушка вне правил

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

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

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

Сирийский рубеж

Дорин Михаил
5. Рубеж
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Сирийский рубеж

Мечников. Клятва лекаря

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

Камень Книга седьмая

Минин Станислав
7. Камень
Фантастика:
фэнтези
боевая фантастика
6.22
рейтинг книги
Камень Книга седьмая

Двойник Короля

Скабер Артемий
1. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля

Отвергнутая невеста генерала драконов

Лунёва Мария
5. Генералы драконов
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Отвергнутая невеста генерала драконов

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

Винокуров Юрий
22. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXII