- •Глава 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
Общий вид оператора статического импорта
Существуют два варианта синтаксической записи оператора import static. Первый, приведенный в листинге 8.2, вариант импортирует единичное имя. Его общий вид приведен в следующей строке:
import static pkg.type-namе.static-member-name;
В этой записи type - name — это имя класса или интерфейса, содержащее нужный статический член. Полное имя пакета, в который входит заданный класс или интерфейс, определено в pkg. А имя члена содержится в static-member-name.
Во втором варианте статического импорта, общий вид которого приведен в следующей строке, импортируются все статические члены:
import static pkg. type-name.*;
Если Вы будете использовать много статических методов или полей, определенных в классе, второй вариант записи позволит импортировать их без явного перечисления. Таким образом, программа из листинга 8.2 могла бы с помощью единственного оператора import импортировать оба метода: sqrt () и pow () (и все остальные статические члены класса Math) в область видимости следующим образом:
import static Java.lang.Math.*;
Конечно, статический импорт не ограничен только классом Math или только методами. В следующей строке приведен пример импортирования статического поля System.out:
import static Java.lang.System.out;
После вставки этого оператора, можно вывести на консоль без уточнения имени стандартного вывода out именем system, как показано в следующей строке:
out.println("After importing System.out, you can use out directly.")
Хорошо ли импортировать поле system.out таким образом— это вопрос для обсуждения. Хотя такой импорт укорачивает оператор, после его применения у человека, читающего программу, пропадает уверенность в том, что имя out ссылается на поле System.out.
Импорт статических членов классов, созданных Вами
Помимо импорта статических членов классов и интерфейсов, определенных в прикладном программном интерфейсе (API) языка Java, Вы можете использовать это средство для импорта статических членов классов и интерфейсов, созданных Вами. Рассмотрим класс Msg, приведенный в листинге 8.3. Обратите внимание на то, что он содержится в пакете, названном
MyMsg.
Листинг 8.З. Статический импорт членов созданного Вами класса
package MyMsg;
public class Msg {
public static final int UPPER = 1;
public static final int LOWER = 2;
public static final int MIXED = 3;
private String msg;
// Display a message in the specified case.
public void showMsg(int how) {
String str;
switch(how) {
case UPPER:
str = msg.toUpperCase();
break;
case LOWER:
str = msg.toLowerCase();
break;
case MIXED:
str = msg;
break;
default:
System.out.println("Invalid command.");
return;
}
System.out.println(str);
}
public Msg(String s) { msg = s; }
}
В классе Msg инкапсулирована строка, которая может выводиться на экран в первоначальном виде (содержит как заглавные, так и строчные буквы), в верхнем регистре (только заглавные буквы) или в нижнем регистре (только строчные буквы) в зависимости от значения, переданного в метод showMsg(). Значения, определяющие, какой регистр используется,— это целочисленные поля, описанные с модификаторами static final и названные upper, lower и mixed. Обычно эти члены должны уточняться с помощью имени класса, например Msg.upper. Предположим, что объект класса Msg назван m, для вывода строки в нижнем регистре пришлось бы вызывать метод showMsg(), как показано в следующей строке:
m.showMsg(Msg.LOWER);
Но если Вы статически импортируете эти значения, то сможете непосредственно использовать их имена следующим образом:
m.showMsg(LOWER);
В листинге 8.4 показан процесс импорта статических членов класса MyMsg.Msg и в дальнейшем использование констант upper, lower и mixed без уточнения их имен.
Листинг 8.4. Статический импорт статических полей, определенных пользователем
import MyMsg.*;
import static MyMsg.Msg.*;
class Test {
public static void main(String args[]) {
Msg m = new Msg("Testing static import.");
m.showMsg(MIXED);
m.showMsg(LOWER);
m.showMsg(UPPER);
}
}
