- •Глава 2 3
- •Глава 3 11
- •Глава 10 117
- •Глава 2 Автоупаковка и автораспаковка
- •Обзор оболочек типов и упаковки значений
- •Основы автоупаковки/распаковки
- •Автоупаковка и методы
- •Автоупаковка/распаковка в выражениях
- •Автоупаковка/распаковка логических и символьных значений
- •Помощь автоупаковки/распаковки в предупреждении ошибок
- •Предостережения
- •Глава 3 Настраиваемые типы
- •Что такое настраиваемые типы
- •Простой пример применения настраиваемых типов
- •Средства настройки типов работают только с объектами
- •Различия настраиваемых типов, основанных на разных аргументах типа
- •Как настраиваемые типы улучшают типовую безопасность
- •Настраиваемый класс с двумя параметрами типа
- •Общий вид объявления настраиваемого класса
- •Ограниченные типы
- •Применение метасимвольных аргументов
- •Ограниченные метасимвольные аргументы
- •Создание настраиваемого метода
- •Настраиваемые конструкторы
- •Настраиваемые интерфейсы
- •Типы raw и разработанный ранее код
- •Иерархии настраиваемых классов
- •Использование настраиваемого суперкласса
- •Настраиваемый подкласс
- •Сравнения типов настраиваемой иерархии во время выполнения программы
- •Переопределенные методы в настраиваемом классе
- •Настраиваемые типы и коллекции
- •Стирание
- •Методы-подставки
- •Ошибки неоднозначности
- •Некоторые ограничения применения настраиваемых типов
- •Нельзя создавать объекты, используя параметры типа
- •Ограничения для статических членов класса
- •Ограничения для настраиваемого массива
- •Ограничение настраиваемых исключений
- •Заключительные замечания
- •Глава 4 Вариант For-Each цикла for
- •Описание цикла for-each
- •Обработка многомерных массивов в цикле
- •Область применения цикла for в стиле for-each
- •Использование цикла for в стиле for-each для обработки коллекций
- •Создание объектов, реализующих интерфейс Iterable
- •Глава 5 Аргументы переменной длины
- •Средство формирования списка с переменным числом аргументов
- •Перегрузка методов с аргументом переменной длины
- •Аргументы переменной длины и неоднозначность
- •Глава 6 Перечислимые типы
- •Описание перечислимого типа
- •Методы values() и valueOf()
- •Перечислимый тип в Java — это класс
- •Перечислимые типы, наследующие тип enum
- •Глава 7 Метаданные
- •Описание средства "метаданные"
- •Задание правил сохранения
- •Получение аннотаций во время выполнения программы с помощью рефлексии
- •Листинг 7.3. Получение всех аннотаций для класса и метода
- •Интерфейс AnnotatedElement
- •Использование значений по умолчанию
- •Аннотации-маркеры
- •Одночленные аннотации
- •Встроенные аннотации
- •Несколько ограничений
- •Глава 8 Статический импорт
- •Описание статического импорта
- •Общий вид оператора статического импорта
- •Импорт статических членов классов, созданных Вами
- •Неоднозначность
- •Предупреждение
- •Глава 9 Форматированный ввод/вывод
- •Форматирование вывода с помощью класса Formatter
- •Конструкторы класса Formatter
- •Методы класса Formatter
- •Основы форматирования
- •Форматирование строк и символов
- •Форматирование чисел
- •Форматирование времени и даты
- •Спецификаторы %n и %%
- •Задание минимальной ширины поля
- •Задание точности представления
- •Применение флагов форматирования
- •Выравнивание вывода
- •Флаг запятая
- •Применение верхнего регистра
- •Использование порядкового номера аргумента
- •Применение метода printf() языка Java
- •Класс Scanner
- •Конструкторы класса Scanner
- •Описание форматирования входных данных
- •Несколько примеров применения класса Scanner
- •Установка разделителей
- •Другие свойства класса Scanner
- •Глава 10 Изменения в api
- •Возможность применения настраиваемых типов при работе с коллекциями
- •Обновление класса Collections
- •Почему настраиваемые коллекции
- •Модернизация других классов и интерфейсов для применения настраиваемых типов
- •Новые классы и интерфейсы, добавленные в пакет java.Lang
- •Класс ProcessBulider
- •Класс StringBuilder
- •Интерфейс Appendable
- •Интерфейс Iterable
- •Интерфейс Readable
- •Новые методы побитной обработки классов Integer и Long
- •Методы signum() u reverseBytes()
- •Поддержка 32-битных кодовых точек для символов Unicode
- •Новые подпакеты пакета java.Lang
- •Классы Formatter и Scanner
Обновление класса Collections
Если Вы посмотрите на приведенный перечень классов коллекций, то увидите, что у класса Сollections нет параметра типа. Причина заключается в том, что класс Сollections целиком состоит из статических методов, которые реализуют алгоритмы обработки коллекций. Следовательно, нет смысла делать этот класс настраиваемым. Однако его методы модифицированы для применения настраиваемых типов благодаря передаче в метод и возврату из метода настраиваемых типов.
В класс collections также включено несколько новых методов. Возможно самый важный среди них набор перегруженных методов checked, таких как checkedСollection(), который возвращает представление коллекции, названное в документации "представлением времени выполнения, обеспечивающим типовую безопасность". Это означает ссылку на коллекцию, в которой динамически во время выполнения проверяется типовое соответствие каждого включаемого в нее элемента. Попытка вставить в коллекцию несовместимый элемент вызывает генерацию исключения типа ClassCastException. Применение такого представления коллекции очень полезно во время отладки, потому что гарантирует наличие в коллекции только подходящих элементов. К родственным методам относятся также методы: CheckedSet(), CheckedList(), CheckedMap() и т.д. Они возвращают представление, наделенное типовой безопасностью, для указанной коллекции.
Кроме того, в класс Collections включены следующие новые методы:
метод frequency (), возвращающий число вхождений элемента;
метод disjoint (), возвращающий значение true, если у двух коллекций нет общих элементов;
метод addAll(), вставляющий содержимое массива в коллекцию;
метод reverseOrder(), возвращающий объект типа comparator для обратного порядка следования элементов.
Почему настраиваемые коллекции
Подробное обсуждение преимуществ использования настраиваемых типов применительно к коллекциям можно найти в главе 3. Здесь же приведено краткое резюме.
В прошлом в коллекции содержались ссылки на объекты класса Object, которые могли указывать на объекты любого типа. Теперь Вы явно задаете тип данных, хранящийся в коллекции. Например, вызов:
list.add("Collections");
корректен, т. к. строка в кавычках — это тип String. Приведенный далее оператор содержит ошибку, поскольку делается попытка сохранить объект класса Integer в переменной list:
list.add(new Integer(10) ); // Ошибка
Этот вызов порождает ошибку несовместимости типов, потому что класс Integer несовместим с типом String.
Еще одно преимущество применения настраиваемых типов в коллекциях заключается в том, что становится ненужным приведение типов при извлечении элемента из коллекции. В исходном тексте старого стиля для получения строки из коллекции list пришлось бы написать оператор, подобный следующему:
String str = (String) list.get(0); //код старого стиля
Раньше приведение типов было необходимо, так как вызов list.get () возвращал тип Object, а не String. Теперь, с появлением настраиваемых типов, Вы можете написать следующий оператор:
String str = list.get(0); // код нового стиля, автоматически извлекается
// тип String
поскольку переменная list — типа LinkedList<String>, компилятору автоматически становится известно о том, что у ссылки, возвращаемой методом list.get(), тип String, и никакого явного приведения типов не требуется.
Помимо удобства, устранение явных преобразований типов также препятствует появлению ошибок. Невозможно случайно преобразовать ссылку, возвращенную методом, таким как get (), в несовместимый тип. В прошлом такие некорректные приведения типов порождали ошибки времени выполнения. С появлением настраиваемых типов подобные недопустимые преобразования типов обнаруживаются на этапе компиляции и могут быть устранены до того, как код будет введен в эксплуатацию.
