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

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

Жанры

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

И наконец, введите метод getColor , возвращающий текущий цвет светофора, а вслед за ним — метод cancel , останавливающий имитацию светофора, присваивая переменной stop логическое значение true. Ниже приведен исходный код обоих методов. // Возврат текущего цвета. TrafficLightColor getColor { return tic; } // Прекращение имитации светофора. void cancel { stop = true; }

Ниже приведен весь исходный код программы, имитирующей автоматизированный светофор с помощью перечисления. // Пример для опробования 12.1. // Имитация автоматизированного светофора с помощью // перечисления, описывающего переключаемые цвета светофора. // Перечисление, представляющее состояния светофора, enum TrafficLightColor { RED, GREEN, YELLOW } // Имитация автоматизированного светофора, 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; } // Запуск имитации автоматизированного светофора, public void run { while(!stop) { try { switch(tic) { case GREEN: Thread.sleep(10000); // Зеленый на 10 секунд break; case YELLOW: Thread.sleep(2000); // Желтый на 2 секунды break; case RED: Thread.sleep(12000); // Красный на 12 секунд break; } } 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; } }

При выполнении этой программы на экран выводится приведенный ниже результат. Как видите, цвета светофора переключаются в требуемой очередности: зеленый, желтый, красный. GREEN YELLOW RED GREEN YELLOW RED GREEN YELLOW RED

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

Используя тот факт, что перечисления реализуются в виде классов, можете усовершенствовать рассмотренную здесь программу. Соответствующее задание будет предложено в упражнении для самопроверки по материалу этой главы в самом ее конце. Автоупаковка

В версии JDK 5 были реализованы два очень важных языковых средства, недостаток которых долгое время ощущали программирующие на Java. Речь идет об автоупаковке и автораспаковке, существенно упрощающих и ускоряющих создание кода, в котором приходится преобразовывать простые типы данных в объекты, и наоборот. А поскольку такие потребности возникают в программах довольно часто, то появление автоупаковки и автораспаковки положительно сказалось на работе практически всех программирующих на Java. Как будет показано в главе 13, автоупаковка и автораспаковка способствовали практическому применению обобщений — еще одного языкового средства, реализованного в Java.

Автоупаковка и автораспаковка непосредственно связаны с оболочками типов и способами внедрения и извлечения значений из экземпляров оболочек. Поэтому рассмотрим сначала оболочки типов и способы упаковки и распаковки Значений вручную. Оболочки типов

Как вам должно быть уже известно, в Java предусмотрены простые типы данных,

в том числе int и double. Простые типы позволяют добиться более высокой эффективности вычислений по сравнению с объектами. Но простые типы не являются частью иерархии объектов и не наследуют свойства и методы класса Object.

Несмотря на высокую эффективность простых типов, возникают такие ситуации, когда для представления данных желательно использовать объекты. Например, переменную простого типа нельзя передать методу по ссылке. Кроме того, многие стандартные структуры данных, реализованные в Java, предполагают работу с объектами, и поэтому в них нельзя хранить данные простых типов. Для преодоления затруднений, возникающих в подобных и во многих других ситуациях, в Java предусмотрены оболочки типов — классы, инкапсулирующие простые типы данных. Классы оболочек типов упоминались в главе 10, а здесь они будут рассмотрены более подробно.

Оболочки типов реализуются в классах Double, Float, Long, Integer, Short, Byte, Character и Boolean, входящих в пакет java. lang. Эти классы предоставляют методы, позволяющие полностью интегрировать простые типы данных в иерархию объектов Java.

Чаще всего применяются оболочки типов, представляющие числовые типы данных: Byte, Short, Integer, Long, Float и Double. Все оболочки числовых типов данных являются производными от абстрактного класса Number. В классе Number определены методы, возвращающие значение объекта для каждого числового типа данных. Эти методы перечислены ниже. byte byteValueO double doubleValue float floatValue int intValue long longValue short shortValue

Например, метод doubleValue возвращает значение объекта как double, метод floatValue — как float и т.д. Перечисленные выше методы реализуются каждым классом оболочки числового типа.

В каждом классе оболочки числового типа предусмотрены конструкторы, позволяющие сформировать объект на основе соответствующего простого типа данных или его строкового представления. Например, в классах Integer и Double имеются следующие конструкторы: Integer(int пит) Integer(String str) Double(double num) Double(String str)

Если параметр str не содержит допустимое строковое представление числового значения, генерируется исключение NumberFormatException.

Во всех оболочках типов переопределен метод toString . Он возвращает из оболочки значение в удобной для чтения форме. Это позволяет выводить значения на экран, передавая объекты оболочек в качестве параметра методу, например println , и не преобразуя их предварительно в простые типы данных.

Процесс инкапсуляции значения в оболочке типа называется упаковкой. До появления версии JDK 5 упаковка производилась вручную, т.е. программирующий на Java строил явным образом экземпляр класса оболочки с нужным значением. Например, для ручной упаковки значения 100 в объект типа Integer требовалась следующая строка кода: Integer iOb = new Integer(100);

В данном примере явно создается объект типа Integer, в который упаковывается значение 100, а ссылка на этот объект присваивается переменной iOb.

Процесс извлечения значения из объекта оболочки называется распаковкой. До появления версии JDK 5 распаковка также производилась вручную, т.е. программирующему на Java приходилось вызывать явным образом соответствующий метод для объекта оболочки, чтобы извлечь значение, упакованное в этом объекте. Например, для распаковки значения из объекта iOb вручную и присваивания результата переменной int требовалась следующая строка кода: int i = iOb.intValue;

В данном примере метод intValue возвращает значение, упакованное в объект iOb как int.

Рассмотренные выше механизмы упаковки и распаковки демонстрируются в приведенном ниже примере программы. // Упаковка и распаковка значений вручную, class Wrap { public static void main(String args[]) { // Упаковка значения 100 производится вручную. Integer iOb = new Integer(100); // Распаковка значения 100 производится вручную. int i = iOb.intValue; System.out.println (i + " " + iOb) ; // отображает значения ЮОиЮО } }

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

Кодекс Охотника. Книга XXXIV

Винокуров Юрий
34. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXIV

Иной. Том 1. Школа на краю пустыни

Amazerak
1. Иной в голове
Фантастика:
боевая фантастика
рпг
аниме
5.75
рейтинг книги
Иной. Том 1. Школа на краю пустыни

Афганский рубеж 3

Дорин Михаил
3. Рубеж
Фантастика:
попаданцы
альтернативная история
6.00
рейтинг книги
Афганский рубеж 3

Вампилов

Румянцев Андрей Григорьевич
1546. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Вампилов

Демон-хранитель

TsissiBlack
Фантастика:
фэнтези
мистика
5.20
рейтинг книги
Демон-хранитель

На цепи

Уваров
1. На цепи
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
На цепи

Мы друг друга не выбирали

Кистяева Марина
1. Мы выбираем...
Любовные романы:
остросюжетные любовные романы
прочие любовные романы
современные любовные романы
5.00
рейтинг книги
Мы друг друга не выбирали

Ботаник 2

Щепетнов Евгений Владимирович
2. Ботаник
Фантастика:
фэнтези
боевая фантастика
6.00
рейтинг книги
Ботаник 2

Искатель 2

Шиленко Сергей
2. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Искатель 2

Тихие ночи

Владимиров Денис
2. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Тихие ночи

Я все еще барон

Дрейк Сириус
4. Дорогой барон!
Фантастика:
боевая фантастика
5.00
рейтинг книги
Я все еще барон

На границе империй. Том 10. Часть 9

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 9

Здравствуй, 1985-й

Иванов Дмитрий
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Здравствуй, 1985-й

Три `Д` для миллиардера. Свадебный салон

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
7.14
рейтинг книги
Три `Д` для миллиардера. Свадебный салон