Брюс Эккель - Философия Java3
Здесь есть возможность читать онлайн «Брюс Эккель - Философия Java3» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Старинная литература, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.
- Название:Философия Java3
- Автор:
- Жанр:
- Год:неизвестен
- ISBN:нет данных
- Рейтинг книги:5 / 5. Голосов: 1
-
Избранное:Добавить в избранное
- Отзывы:
-
Ваша оценка:
- 100
- 1
- 2
- 3
- 4
- 5
Философия Java3: краткое содержание, описание и аннотация
Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Философия Java3»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.
Философия Java3 — читать онлайн бесплатно полную книгу (весь текст) целиком
Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Философия Java3», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.
Интервал:
Закладка:
//. holding/MapOfList.java package holding; import typeinfo pets.*, import java.util.*.
import static net.mindview util Print *;
public class MapOfList {
public static Map{ private Class baseType; public TypeCounter(CIass baseType) { this.baseType = baseType;
}
public void count(Object obj) {
Class type = obj .getClassO; i f(!baseType.i sAssi gnableFrom(type))
throw new RuntimeException(obj + " incorrect type: " + type + should be type or subtype of " + baseType);
countClass(type);
}
private void countClass(Class type) { Integer quantity = get(type); put(type, quantity == null ? 1 : quantity +1); Class superclass = type.getSuperclassO; if(superClass != null &&
baseType.i sAssi gnableFrom(superClass)) countClass(superClass);
}
public String toStringO {
StringBuilder result = new StringBuilder("{"); for(Map.Entry.Integer> pair : entrySetO) { result.append(pair.getKeyО.getSimpleName()); result.append("="); res ul t.a ppend(pa i r.getVa1ue О); result.append(". ");
}
result.delete(result.1ength О -2, result. 1 ength О); result.append("}"); return result.toStringO;
}
} ///:-
Метод count() получает Class для своего аргумента, а затем использует.isAs-signableFrom() для проверки принадлежности объекта к интересующей вас иерархии. Метод countClas^O сначала производит подсчет для точного типа класса, а затем, если baseType допускает присваивание из суперкласса, рекурсивно вызывает countClass() для суперкласса.
II: typeinfo/PetCount4.java
import typeinfo.pets.*,
import net.mindview.util.*;
import static net.mindview.util.Print.*;
public class PetCount4 {
public static void main(String[] args) {
TypeCounter counter = new TypeCounter(Pet.class); for(Pet pet : Pets.createArray(20)) {
printnb(pet.getClass().getSimpleNameO + " "); counter.count(pet);
}
printO:
print(counter); _ Л
продолжение &
}
} /* Output: (Пример)
Rat Manx Cymric Mutt Pug Cymric Pug Manx Cymric Rat EgyptianMau Hamster EgyptianMau Mutt Mutt Cymric Mouse Pug Mouse Cymric
{Mouse=2, Dog=6, Manx=7, EgyptianMau=2, Rodent=5, Pug=3, Mutt=3. Cymric=5, Cat=9. Hamster=l, Pet=20, Rat=2} *///:-
Как видно из результатов, подсчитываются как базовые, так и конкретные типы.
Регистрация фабрик
У построения объектов иерархии Pet есть один недостаток: каждый раз, когда в иерархию включается новый тип Pet, вы должны добавить его в LiteralPet-Creator.java. В системах с регулярным добавлением новых классов это может создать проблемы.
Первое, что приходит в голову, — добавить в каждый класс статический инициализатор, который добавлял бы свой класс в некий список. К сожалению, статические инициализаторы вызываются только при первой загрузке класса, поэтому возникает «порочный круг»: класс отсутствует в списке генератора, поэтому генератор не может создать объект этого класса, соответственно, класс не загрузится и не будет помещен в список.
По сути, вы вынуждены создать список вручную (разве что вы напишете утилиту, которая будет анализировать исходный код, а затем создавать и компилировать список). Вероятно, лучшее, что можно сделать, — это разместить список в одном централизованном, очевидном месте. Вероятно, лучшим местом для него будет базовый класс иерархии.
В этом разделе мы также внесем другое изменение: создание объекта будет передано самому классу с использованием паттерна «метод-фабрика». Метод-фабрика может вызываться полиморфно и создает объект соответствующего типа. В следующей упрощенной версии методом-фабрикой является метод create() интерфейса Factory:
//: typeinfo/factory/Factory.java package typeinfo.factory:
public interface Factory { T createO; } ///•-
Обобщенный параметр T позволяет create() возвращать разные типы для разных реализаций Factory. Также при этом используется ковариантность возвращаемых типов.
В следующем примере базовый класс Part содержит список объектов-фабрик. Фабрики типов, которые должны создаваться методом createRandom(), «регистрируются» в базовом классе включением в список partFactories:
//: typeinfo/RegisteredFactories.java II Регистрация фабрик в базовом классе import typeinfo.factory.*: import java util.*:
class Part {
public String toStringO {
return getClass().getSimpleName();
}
static List
static {
// При вызове Collections addAllO выдается предупреждение // "unchecked generic array creation for varargs parameter" partFactories.add(new Fuel Filter FactoryO). partFactories add(new AirFilter FactoryO), partFactories add(new CabinAirFilter.FactoryO), partFactories add(new Oil Filter FactoryO); partFactories add(new FanBelt FactoryO); partFactories.add(new PowerSteeringBelt.Factory()), partFactories add(new GeneratorBelt FactoryO),
}
private static Random rand = new Random(47);
public static Part createRandomO {
int n = rand nextInt(partFactories sizeO), return partFactories get(n) createO;
class Filter extends Part {}
class Fuel Filter extends Filter {
// Создание фабрики для каждого конкретного типа
public static class Factory
implements typeinfo factory.Factory {
public Fuel Filter createO { return new Fuel Filter О. }
}
}
class AirFilter extends Filter { public static class Factory implements typeinfo factory Factory {
public AirFilter createO { return new AirFilterO. }
}
}
class CabinAirFiIter extends Filter { public static class Factory
implements typeinfo factory Factory { public CabinAi rFi Iter createO {
return new CabinAirFilter();
}
class Oil Filter extends Filter { public static class Factory implements typeinfo factory Factory {
public Oil Filter createO { return new OilFilterO; }
}
}
class Belt extends Part {}
Читать дальшеИнтервал:
Закладка:
Похожие книги на «Философия Java3»
Представляем Вашему вниманию похожие книги на «Философия Java3» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.
Обсуждение, отзывы о книге «Философия Java3» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.