- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания Java: руководство для начинающих (ЛП) - Шилдт Герберт
Шрифт:
Интервал:
Закладка:
В операторе switch проверяются сведения о цвете светофора, хранящиеся в переменной tic, после чего этой переменной присваивается другой цвет. Обратите внимание на то, что этот метод синхронизирован. Это необходимо потому, что он вызывает метод notify (), уведомляющий о смене цвета. (Напомним, что обратиться к методу notify () можно только из синхронизированного контекста.)
Далее введите метод wait For Change (), ожидающий переключения цвета светофора. // Ожидание переключения цвета светофора, synchronized void waitForChange() { try { while(!changed) wait(); // ожидать переключения цвета светофора changed = false; } catch(InterruptedException exc) { System.out.println(exc); } } Действие этого метода ограничивается вызовом метода wait (). Возврат из него не произойдет до тех пор, пока в методе changeColor () не будет вызван метод notify (). Следовательно, метод waitForChange () не завершится до переключения цвета светофора.
И наконец, введите метод 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 byteValueOdouble 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);