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

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

Жанры

Философия Java3

Эккель Брюс

Шрифт:

throw new RuntimeException(e), } catchdllegalAccessException e) {

throw new RuntimeException(e).

}

}

public Pet[] createArray(int size) { Pet[] result = new Pet[size], for(int i = 0. i < size, i++)

result[i] = randomPetO. return result;

}

public ArrayList<Pet> arrayList(int size) {

ArrayList<Pet> result = new ArrayList<Pet>, Collections addAll(result, createArray(size)), return result,

}

} /// ~

Абстрактный метод getTypes поручает производному классу получение списка объектов Class. В качестве типа класса указан «любой производный от Pet», поэтому newlnstance создает Pet без необходимости преобразования типа. Метод randomPet осуществляет случайную выборку из List и использует полученные объекты Class для создания нового экземпляра данного класса вызовом Class. newlnstance. Метод createArray использует randomPet для заполнения массива, a arrayList, в свою очередь, использует createArray.

При вызове newlnstance возможны два вида исключений, обрабатываемые в секциях catch за блоком try. Имена исключений достаточно хорошо объясняют суть проблемы (IllegalAccessException — нарушение механизма безопасности Java, в данном случае если конструктор по умолчанию объявлен private).

Определяя субкласс PetCreator, достаточно предоставить список типов Pet, которые должны создаваться с использованием randomPet и других методов. Метод getTypes возвращает ссылку на статический объект List. Реализация с использованием forName выглядит так:

//• typei nfo/pets/ForNameCreator.java package typeinfo pets; import java util *;

public class ForNameCreator extends PetCreator {

private static List<Class<? extends Pet» types =

new ArrayList<Class<? extends Pet». Л Л

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

II Типы, создаваемые случайным образом, private static StringE] typeNames = { "typeinfo pets.Mutt", "typeinfo pets Pug", "typeinfo pets EgyptianMau", "typeinfo pets.Manx", "typeinfo.pets.Cymric", "typeinfo.pets.Rat", "typeinfo.pets.Mouse", "typeinfo pets.Hamster"

}:

@SuppressWarni ngs("unchecked") private static void loaderO { try {

for(String name : typeNames) types.add(

(Class<? extends Pet>)Class forName(name)). } catch(ClassNotFoundException e) {

throw new RuntimeException(e);

}

}

static { loaderO; }

public List<Class<? extends Pet» types О {return types,} } ///:-

Метод loader создает список List объектов Class с использованием метода Class.forName. При этом может произойти исключение ClassNotFoundException, что вполне понятно — ведь ему передается строка, содержимое которой невозможно проверить на стадии компиляции. При ссылке на эти классы необходимо указывать имя пакета, которому они принадлежат (typeinfo).

Для получения типизованного списка объектов Class требуется преобразование типа, что приводит к выдаче предупреждения на стадии компиляции. Метод loader определяется отдельно и размещается в секции статической инициализации, потому что директива @SuppressWarnings не может располагаться прямо в секции статической инициализации.

Для подсчета объектов Pet нам понадобится механизм подсчета их разных видов. Для этой цели идеально подойдет карта (Map), в которой ключами являются имена типов Pet, а значениями — переменные Integer с количеством Pet. Например, это позволит получать ответы на вопросы типа «сколько существует объектов Hamster?». При подсчете Pet будет использоваться ключевое слово instanceof:

II: typeinfo/PetCount.java II Использование instanceof. import typeinfo.pets.*; import java util.*;

import static net.mindview.util.Print.*,

public class PetCount {

static class PetCounter extends HashMap<String,Integer> { public void count(String type) {

Integer quantity = get(type); if(quantity == null) put(type, 1);

else

put(type, quantity +1),

}

}

public static void

countPets(PetCreator creator) {

PetCounter counter= new PetCounter, for(Pet pet : creator.createArray(20)) { // Подсчет всех объектов Pet: printnb(pet.getClass.getSimpleNameO + " "), if(pet instanceof Pet)

counter.count("Pet"); if(pet instanceof Dog)

counter.count("Dog"); if(pet instanceof Mutt)

counter count("Mutt"), if(pet instanceof Pug)

counter countC'Pug"); if(pet instanceof Cat)

counter.count("Cat"); if(pet instanceof Manx)

counter count("EgyptianMau"); if(pet instanceof Manx)

counter.count("Manx"); if(pet instanceof Manx)

counter.count("Cymric"). if(pet instanceof Rodent)

counter.count("Rodent"), if(pet instanceof Rat)

counter count("Rat"); if(pet instanceof Mouse)

counter.count("Mouse"); if(pet instanceof Hamster)

counter.count("Hamster"),

}

// Вывод результатов подсчета.

printO;

print(counter);

}

public static void main(String[] args) { countPets(new ForNameCreator);

}

} /* Output-

Rat Manx Cymric Mutt Pug Cymric Pug Manx Cymric Rat EgyptianMau Hamster EgyptianMau Mutt

Mutt Cymric Mouse Pug Mouse Cymric

{Pug=3. Cat=9, Hamster=l, Cymric=7, Mouse=2, Mutt=3, Rodent=5, Pet=20, Manx=7,

EgyptianMau=7, Dog=6, Rat=2}

*///:-

В countPets массив случайным образом заполняется объектами Pet с использованием PetCreator. Затем каждый объект Pet в массиве тестируется и подсчи-тывается при помощи instanceof.

У ключевого слова instanceof имеется одно серьезное ограничение: объект можно сравнивать только с именованным типом, но не с объектом Class. Возможно, вам показалось, что в предыдущем примере перебор всех выражений instanceof выглядит неудобно и громоздко, и вы правы. Тем не менее автоматизировать этот процесс невозможно — создать из объектов Class список ArrayList и сравнивать объекты по очереди с каждым его элементом не получится (к счастью, существует альтернативное решение, но это попозже). Впрочем, особенно горевать по этому поводу не стоит — если вам приходится записывать множество проверок instanceof, скорее всего, изъян кроется в архитектуре программы.

Использование литералов class

Если записать пример PetCreator.java с использованием литералов class, программа во многих отношениях становится более понятной:

//• typeinfo/pets/LiteralPetCreator.java // Using class literals package typeinfo pets, import java util.*;

public class LiteralPetCreator extends PetCreator { // Блок try не нужен @SuppressWarnings("unchecked")

public static final List<Class<? extends Pet» all Types = Col 1 ections unmodi fi ableLi st(Arrays.asLi st(

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

Царь царей

Билик Дмитрий Александрович
9. Бедовый
Фантастика:
фэнтези
мистика
5.00
рейтинг книги
Царь царей

Законы Рода. Том 14

Андрей Мельник
14. Граф Берестьев
Фантастика:
аниме
фэнтези
эпическая фантастика
5.00
рейтинг книги
Законы Рода. Том 14

Имя нам Легион. Том 9

Дорничев Дмитрий
9. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 9

Точка Бифуркации VI

Смит Дейлор
6. ТБ
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Точка Бифуркации VI

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

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

Студиозус

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

Лекарь Империи 9

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

Цикл "Идеальный мир для Лекаря". Компиляция. Книги 1-30

Сапфир Олег
Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Цикл Идеальный мир для Лекаря. Компиляция. Книги 1-30

Рассвет русского царства

Грехов Тимофей
1. Новая Русь
Документальная литература:
историческая литература
5.00
рейтинг книги
Рассвет русского царства

Первый среди равных. Книга VIII

Бор Жорж
8. Первый среди Равных
Фантастика:
аниме
фантастика: прочее
эпическая фантастика
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга VIII

Отморозок 5

Поповский Андрей Владимирович
5. Отморозок
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Отморозок 5

Император Пограничья 4

Астахов Евгений Евгеньевич
4. Император Пограничья
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 4

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

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 9

Отморозок 4

Поповский Андрей Владимирович
4. Отморозок
Фантастика:
попаданцы
фантастика: прочее
5.00
рейтинг книги
Отморозок 4