Читать «Java: руководство для начинающих» онлайн - страница 367

Герберт Шилдт

Программу, имитирующую автоматизированный светофор и созданную в примере для опробования 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 (); } }