Интерфейсы
Наконец, можно использовать интерфейсы просто для определения констант, как показано в листинге 3.4.
Листинг 3.4. Система управления светофором.
interface Lights{ int RED = 0; int YELLOW = 1; int GREEN = 2; int ERROR = -1; } class Timer implements Lights{ private int delay; private static int light = RED; Timer(int sec)(delay = 1000 * sec;} public int SHIFT(){ int count = (light++) % 3; try{ switch(count){ case RED: Thread.sleep(delay); break; case YELLOW: Thread.sleep(delay/3); break; case GREEN: Thread.sleep(delay/2); break; } }catch(Exception e){return ERROR;} return count; } } class TrafficRegulator{ private static Timer t = new Timer(1); public static void main(String[] args){ for (int k = -0; k < 10; k++) switch(t.SHIFT()){ case Lights.RED: System.out.println("Stop!"); break; case Lights.YELLOW: System.out.println("Wait!"); break; case Lights.GREEN: System.out.println("Go!"); break; case Lights.ERROR: System.err.println("Time Error"); break; default: System.err.println("Unknown light."); return; } } }
Здесь, в интерфейсе Lights, определены константы, общие для всего проекта.
Класс Timer реализует этот интерфейс и использует константы напрямую как свои собственные. Метод SHIFT () этого класса подает сигналы переключения светофору с разной задержкой в зависимости от цвета. Задержку осуществляет метод sleep() класса Thread из стандартной библиотеки, которому передается время задержки в миллисекундах. Этот метод нуждается в обработке исключений try{} catch() {}, о которой мы будем говорить в главе 16.
Класс TrafficReguiator не реализует интерфейс Lights и пользуется полными именами Lights.RED и т.д. Это возможно потому, что константы RED, YELLOW и GREEN по умолчанию являются статическими.
Теперь нам известны все средства языка Java, позволяющие проектировать решение поставленной задачи. Заканчивая разговор о проектировании, нельзя не упомянуть о постоянно пополняемой коллекции образцов проектирования (design patterns).