На этом шаге мы рассмотрим локальные внутренние классы
Если внимательно проанализировать исходный код класса TalkingClock, то можно обнаружить, что имя класса TimerPrinter используется лишь однажды: при создании объекта данного типа в методе start(). В подобных случаях класс можно определить локально в отдельном методе, как это сделано ниже в примере:
public void start() { class TimePrinter implements ActionListener { @Override public void actionPerformed(ActionEvent e) { Date now = new Date(); System.out.println("now " + now); if (beep) { Toolkit.getDefaultToolkit().beep(); } } } ActionListener listener = new TimePrinter(); Timer timer = new Timer(interval, listener); timer.start(); }
Локальные внутренние классы никогда не объявляются с помощью модификаторов доступа. Их область действия всегда ограничивается блоком, в котором они объявлены. У локальных внутренних классов имеется большое преимущество: они полностью скрыты от внешнего кода и даже от остальной части класса TalkingClock. Ни одному из методов, за исключением start(), ничего неизвестно о классе TimerPrinter.
На следующем шаге мы рассмотрим анонимные внутренние классы