- •Глава 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
Глава 6 Перечислимые типы
Начиная с выхода первой версии языка Java, в нем было пропущено одно средство, в котором нуждалась большая часть программистов: перечислимые типы или перечисления (enumirations). В простейшей форме перечислимый тип — это список именованных констант. Хотя язык Java предлагал другие способы для реализации подобной функциональности, например переменные с модификатором поля final, многие программисты были лишены концептуальной чистоты перечислимого типа, который поддерживается в других популярных языках программирования. С выходом Java 2 версии 5.0 перечислимый тип стал доступен и программистам, пишущим на языке Java.
На первый взгляд перечислимый тип языка Java кажется подобным одноименному типу в других языках программирования. Но это подобие обманчиво. В языках, таких как C++, перечислимые типы — просто списки именованных целочисленных констант. В языке Java перечислимый тип определен как класс. Превращение перечислимого типа в класс существенно расширило его возможности. Например, в языке Java у перечислимого типа могут быть конструкторы, методы и поля. Таким образом, хотя перечислимые типы готовились несколько лет, реализация их в языке Java оправдала ожидания.
Описание перечислимого типа
Перечислимый тип создается с помощью нового ключевого слова enum. Например, в следующем фрагменте приведен пример простого перечислимого типа, в который включены разные сорта яблок.
// Перечислимый тип для сортов яблок.
enum Apple {
Jonathan, GoldenDel, RedDel, Winesap, Cortland
}
Идентификаторы Jonathan, GoldenDel и так далее называются константами перечислимого типа (enumeration constants). Каждая объявляется неявно общедоступным, статическим членом класса Apple, Более того, их тип — это перечислимый тип (класс), в котором они объявлены, в нашем случае — Apple. В языке Java эти константы называются само типизированными (self-typed), причем "само" ссылается на содержащий их перечислимый тип.
После того как Вы описали перечислимый тип, можете создать переменную этого типа. Но, несмотря на то, что перечислимые типы определены как классы, Вы не можете создать экземпляр типа enum с помощью операции new. Вместо этого Вы объявляете и используете переменную перечислимого типа почти так же, как Вы поступаете с переменными одного из базовых типов, таких как int или char. В следующей строке приведен пример объявления ар как переменной класса перечислимого типа Apple:
Apple ар;
Поскольку у переменной ар тип Apple, ей можно присвоить (или она может содержать) только те значения, которые определены в классе Apple. В следующей строке приведено присваивание переменной ар значения RedDel:
ар = Apple.RedDel;
Обратите внимание на то, что наименованию RedDel предшествует имя
Apple.
Можно проверить равенство двух констант перечислимого типа с помощью операции отношения = =. В следующей строке приведен пример сравнения переменной ар с константой GoldenDel.
if(ар = = Apple.GoldenDel) //
Значение перечислимого типа можно использовать для управления оператором switch. Конечно, во всех операторах сазе должны быть константы того же перечислимого типа, который используется в условном выражении оператора switch. Оператор switch, приведенный в следующих строках, вполне корректен.
// Использует тип enum для управления оператором switch.
switch(ар) {
case Jonathan: //...
case GoldenDel: //...
case RedDel: //...
case Winsap: //...
Обратите внимание на то, что в операторах case используются имена констант перечислимого типа без уточнения с помощью имени их класса. Просто Winsap, а не Apple.Winsap. Такой способ задания имени возможен, по тому, что перечислимый тип в выражении оператора switch уже неявным образом задал тип констант в операторах case, поэтому нет необходимости задавать в них константы с указанием их имени типа.
Когда константа перечислимого типа отображается, например, с помощью метода println(), на экран выводится ее имя. Далее приведен пример:
System.out.println(Apple.Winsap)
который выводит на экран имя Winsap.
В листинге 6.1 собраны все фрагменты, демонстрирующие применение перечислимого типа Apple.
Листинг 6.1. Перечислимый тип для сортов яблок
enum Apple {
Jonathan, GoldenDel, RedDel, Winsap, Cortland
}
class EnumDemo {
public static void main(String args[])
{
Apple ap;
ap = Apple.RedDel;
// Output an enum value.
System.out.println("Value of ap: " + ap);
System.out.println();
ap = Apple.GoldenDel;
// Compare two enum values.
if(ap == Apple.GoldenDel)
System.out.println("ap conatins GoldenDel.\n");
// Use an enum to control a switch statement.
switch(ap) {
case Jonathan:
System.out.println("Jonathan is red.");
break;
case GoldenDel:
System.out.println("Golden Delicious is yellow.");
break;
case RedDel:
System.out.println("Red Delicious is red.");
break;
case Winsap:
System.out.println("Winsap is red.");
break;
case Cortland:
System.out.println("Cortland is red.");
break;
}
}
}
Далее приведен вывод результатов работы программы из листинга 6.1:
Value of ар: RedDel
ар contains GoldenDel.
Golden Delicious is yellow.
