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

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

Жанры

Java: руководство для начинающих
Шрифт:

статический импорт и аннотации

Константы перечислимого типа иногда называются самотипизированными. Что это означает? Часть “само” в термине самотипизированный означает тип перечисления, в котором определена константа. Следовательно, константа перечислимого типа является объектом того перечисления, в которое она входит.

Какой класс автоматически наследуют перечисления? Все перечисления наследуют от класса Enum.

Напишите для приведенного ниже перечисления программу, в которой метод values служит для отображения списка констант и их значений. enum Tools { SCREWDRIVER, WRENCH, HAMMER, PLIERS } Это задание имеет следующее решение: enum Tools { SCREWDRIVER, WRENCH, HAMMER, PLIERS } class ShowEnum { public static void main(String args[]) { for(Tools d : Tools.values) System.out.print(d + " has ordinal value of " + d.ordinal + '\n'); } }

Программу, имитирующую автоматизированный светофор и созданную в примере для опробования 12.1, можно усовершенствовать, внеся ряд простых изменений, чтобы выгодно воспользоваться возможностями перечислений. В исходной версии этой программы

продолжительность отображения каждого цвета светофора регулировалась в классе Traf ficLightSimulator, причем величины задержек были жестко запрограммированы в методе run . Измените исходный код программы 584 Jav\, 7: руководство для начинающих, 5-е издание таким образом, чтобы продолжительность отображения каждого цвета светофора задавалась константами перечислимого типа Traf f icLightColor. Для этого вам понадобятся конструктор, переменная экземпляра, объявленная как private, а также метод getDelay . Подумайте о том, как еще можно улучшить данную программу. (Подсказка: попробуйте отказаться от оператора switch и воспользоваться порядковыми значениями каждого цвета для переключения светофора.) Усовершенствованная версия программы, имитирующей работу светофора, приведена ниже. В нее внесены два существенных изменения. Во-первых, величина задержки переключения связана теперь со значением перечислимого типа, что улучшает структуру кода. И во-вторых, в методе run удалось обойтись без оператора switch. Вместо этого методу sleep теперь передается вызов tic. getDelay , и благодаря этому автоматически устанавливается задержка, соответствующая текущему цвету светофора. // Усовершенствованная версия программы, имитирующей работу светофора. // Величины задержки теперь хранятся в классе TrafficLightColor. // Перечисление цветов переключения светофора, enum TrafficLightColor { RED(12000), GREEN(10000), YELLOW(2000); private int delay; TrafficLightColor(int d) { delay = d; } int getDelay { return delay; } } // Имитация автоматизированного светофора, class TrafficLightSimulator implements Runnable { private Thread thrd; // Поток для имитации светофора private TrafficLightColor tic; // Текущее значение цвета boolean stop = false; // Остановка имитации, если истинно boolean changed = false; // Переключение светофора, если истинно TrafficLightSimulator(TrafficLightColor init) { tic = init; thrd = new Thread(this); thrd.start; } TrafficLightSimulator { tic = TrafficLightColor.RED; thrd = new Thread(this); thrd.start; } // Запуск имитации автоматизированного светофора. Приложение А. Ответы на вопросы для самопроверки 585 public void run { while(!stop) { // По сравнению с предыдущей версией программы // код значительно упростился! try { Thread.sleep(tlc.getDelay); } catch(InterruptedException exc) { System.out.println(exc); } changeColor ; } } // Переключение цвета светофора, synchronized void changeColor { switch(tic) { case RED: tic = TrafficLightColor.GREEN; break; case YELLOW: tic = TrafficLightColor.RED; break; case GREEN: tic = TrafficLightColor.YELLOW; } changed = true; notify; // уведомить о переключении цвета светофора } // Ожидание переключения цвета светофора, synchronized void waitForChange { try { while(!changed) wait; // ожидать переключения цвета светофора changed = false; } catch(InterruptedException exc) { System.out.println(exc); } } // Возврат текущего цвета. TrafficLightColor getColor { return tic; } // Прекращение имитации светофора, void cancel { stop = true; class TrafficLightDemo { public static void main(String args[]) { TrafficLightSimulator tl = new TrafficLightSimulator(TrafficLightColor.GREEN); for(int i=0; i < 9; i++) { System.out.println(tl.getColor); tl.waitForChange; } tl.cancel ; } }

Что такое упаковка и распаковка? В каких случаях производится автоупаковка и автораспаковка? Упаковка означает включение значения простого типа в объект оболочки, а распаковка — извлечение значения из объекта оболочки. Автоупаковка означает автоматическую упаковку значения без явного создания объекта, тогда как при автораспаковке значение простого типа автоматически извлекается из объекта оболочки без явного вызова соответствующего метода, например intValue .

Измените следующий фрагмент кода таким образом, чтобы в нем производилась автоупаковка: Short val = new Short(123); Это задание имеет следующее решение: Short val = 123;

Объясните, что такое статический импорт? Статический импорт означает размещение статических членов класса или интерфейса в глобальном пространстве имен. Это позволяет использовать статические члены без указания имени соответствующего класса или интерфейса.

Какие действия выполняет приведенный ниже оператор? import static java.lang.Integer.parselnt; Этот оператор помещает в глобальное пространство имен метод parselnt из класса оболочки типа Integer.

Следует ли употреблять статический импорт от случая к случаю или желательно импортировать статические члены всех классов? Статический импорт уместен только в отдельных случаях. Если доступным окажется слишком много статических членов, это может привести к конфликтам имен и нарушению структуры кода.

Синтаксис аннотации основывается на . интерфейсе

Какая аннотация называется маркером? Маркер — это аннотация без аргументов.

Аннотации применимы только к методам. Верно или неверно? Неверно. Любое объявление может быть аннотировано. Глава 13. Обобщения

Обобщения очень важны, поскольку они позволяют создавать код, который: а) обеспечивает типовую безопасность; б) пригоден для повторного использования; в) отличается высокой надежностью; г) обладает всеми перечисленными выше свойствами. Ответ: г) код обладает всеми перечисленными выше свойствами.

Можно ли указывать простой тип в качестве аргумента типа? Нет, нельзя. В качестве аргументов типа можно указывать только типы объектов.

Как объявить класс FlightSched с двумя параметрами типа? Это задание имеет следующее решение: class FlightSched {

Измените ваш ответ на вопрос 3 таким образом, чтобы второй параметр типа обозначал подкласс, производный от класса Thread. Это задание имеет следующее решение: class FlightSched {

Внесите изменения в класс FlightSched таким образом, чтобы второй параметр типа стал подклассом первого параметра типа. Это задание имеет следующее решение: class FlightSchedCT, V extends Т> {

Что обозначает знак ? в обобщениях? Знак ? обозначает метасимвольный аргумент, который соответствует любому допустимому типу.

Может ли метасимвольный аргумент быть ограниченным? Да. Метасимвольный аргумент может ограничиваться как сверху, так и снизу.

У обобщенного метода My Gen имеется один параметр типа, определяющий тип передаваемого ему аргумента. Этот метод возвращает также объект, тип которого соответствует параметру типа. Как должен быть объявлен метод MyGen ? Это задание имеет следующее решение: <Т> Т MyGen(Т о) {//.. .

Допустим, обобщенный интерфейс объявлен так, как показано ниже, interface IGenlFCT, V extends Т> { // ... Составьте объявление класса MyClass, который реализует интерфейс I Gen IF. Это задание имеет следующее решение: class MyClass implements IGenlFCT, V> { // ...

Допустим, имеется обобщенный класс Counter. Как создать объект его базового типа? Для того чтобы получить базовый тип из обобщенного класса Counter, достаточно указать его имя, не обозначая тип, как показано ниже. Counter х = new Counter; 588 Java 7r руководство для начинающих, 5-е издание

Существуют ли параметры типа на стадии выполнения программы? Нет. Все параметры типа удаляются на стадии компиляции и заменяются соответствующими приводимыми типами. Этот процесс называется стиранием.

Видоизмените ответ на вопрос 10 в упражнении по материалу главы 9 таким образом, чтобы сделать класс обобщенным. По ходу дела создайте интерфейс стека IGenStack, объявив в нем обобщенные методы push и pop . // Обобщенный стек. interface IGenStack { void push(T obj) throws StackFullException; T pop throws StackEmptyException; } // Исключение, возникающее при переполнении стека, class StackFullException extends Exception { int size; StackFullException(int s) { size = s; } public String toString { return "\nStack is full. Maximum size is " + size; } } // Исключение, возникающее при обращении к пустому стеку, class StackEmptyException extends Exception { public String toString { return "\nStack is empty.”; } } // Класс, реализующий стек для хранения объектов обобщенного типа, class GenStack implements IGenStack { private T stck[]; // Массив для хранения элементов стека private int tos; // Вершина стека // построить пустой стек заданного размера GenStack(T[] stckArray) { stck = stckArray; tos = 0; } // построить один стек из другого стека GenStack(T[] stckArray, GenStack ob) { tos = ob.tos; stck = stckArray; try { Приложение А. Ответы на вопросы для самопроверки 589 if(stck.length < ob.stck.length) throw new StackFullException(stck.length); } catch(StackFullException exc) { System.out.println(exc); } // скопировать элементы for(int i=0; i < tos; i++) > stck[i] = ob.stck[i]; } // построить стек с исходными значениями GenStack(T[] stckArray, Т[] а) { stck = stckArray; for(int i = 0; i < a.length; i++) { try { push(a [i]); } catch(StackFullException exc) { System.out.println(exc); } } } // поместить объекты в стек public void push(T obj) throws StackFullException { if(tos==stck.length) throw new StackFullException(stck.length); stck[tos] = obj; tos++; } // извлечь объекты из стека public Т pop throws StackEmptyException { if(tos==0) throw new StackEmptyException; tos—; return stck[tos]; } } // продемонстрировать применение класса GenStack class GenStackDemo { public static void main(String args[]) { // создать пустой стек на 10 элементов типа Integer Integer iStore[] = new Integer[10]; GenStack stkl = new GenStack (i'Store) ; // построить стек из массива String name[] = {"One", "Two", "Three"}; String strStore[] = new String[3]; GenStack stk2 = new GenStack(strStore, name); String str; int n; try { // поместить ряд значений в стек stkl for(int i=0; i < 10; i++) stkl.push(i); } catch(StackFullException exc) { System.out.println(exc); } // построить один стек из другого стека String strStore2[] = new String[3]; GenStack stk3 = new GenStack(strStore2, stk2); try { // отобразить стеки System.out.print("Contents of stkl: "); for(int i=0; i < 10; i++) { n = stkl.pop; System.out.print(n + " "); } System.out.println("\n"); System.out.print("Contents of stk2: "); for(int i=0; i < 3; i++) { str = stk2.pop; System.out.print(str + " "); } System.out.println("\n"); System.out.print("Contents of stk3: "); for(int i=0; i < 3; i++) { str = stk3.pop; System.out.print(str + " "); } } catch(StackEmptyException exc) { System.out.println(exc); } System.out.println; } } Приложение А. Ответы на вопросы для самопроверки 591

Что обозначают угловые скобки (< >)? Угловые скобки обозначают ромбовидный оператор.

Как упростить приведенную ниже строку кода в версии JDK 7? MyClass obj = new MyClass(1.1,"Hi"); Эту строку кода можно упростить, используя ромбовидный оператор следующим образом: MyClass obj = new MyClasso(1.1,"Hi"); Глава 14. Апплеты, события и прочее

Какой метод вызывается первым в начале выполнения апплета? Какой метод вызывается, когда апплет должен быть удален из системы? Выполнение апплета начинается с вызова метода init . А перед удалением апплета вызывается метод destroy ..

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

Ветер перемен

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

LIVE-RPG. Эволюция 2

Кронос Александр
2. Эволюция. Live-RPG
Фантастика:
социально-философская фантастика
героическая фантастика
киберпанк
7.29
рейтинг книги
LIVE-RPG. Эволюция 2

Идеальный мир для Социопата 5

Сапфир Олег
5. Социопат
Фантастика:
боевая фантастика
рпг
5.50
рейтинг книги
Идеальный мир для Социопата 5

Proxy bellum

Ланцов Михаил Алексеевич
5. Фрунзе
Фантастика:
попаданцы
альтернативная история
4.25
рейтинг книги
Proxy bellum

Ваантан

Кораблев Родион
10. Другая сторона
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Ваантан

Архил...?

Кожевников Павел
1. Архил...?
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Архил...?

Восьмое правило дворянина

Герда Александр
8. Истинный дворянин
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восьмое правило дворянина

Шипучка для Сухого

Зайцева Мария
Любовные романы:
современные любовные романы
8.29
рейтинг книги
Шипучка для Сухого

Шатун. Лесной гамбит

Трофимов Ерофей
2. Шатун
Фантастика:
боевая фантастика
7.43
рейтинг книги
Шатун. Лесной гамбит

Бальмануг. (Не) Любовница 2

Лашина Полина
4. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Бальмануг. (Не) Любовница 2

Курсант: Назад в СССР 7

Дамиров Рафаэль
7. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: Назад в СССР 7

Книга пяти колец. Том 2

Зайцев Константин
2. Книга пяти колец
Фантастика:
фэнтези
боевая фантастика
5.00
рейтинг книги
Книга пяти колец. Том 2

Идеальный мир для Лекаря 7

Сапфир Олег
7. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 7

Отмороженный 6.0

Гарцевич Евгений Александрович
6. Отмороженный
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Отмороженный 6.0