Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Принцип работы интерфейсных переменных в Java

#java #ооп


Только начал изучать Java, поэтому вопрос скорее всего глупый. Пример кода из Хорстманна:

public class TimerTest
{
public static void main(String[] args)
  {
    ActionListener listener = new TimePrinter();

    // construct a timer that calls the listener
    // once every 10 seconds
    Timer t = new Timer(10000, listener);
    t.start();

    JOptionPane.showMessageDialog(null, "Quit program?");
    System.exit(0);
  }
}

class TimePrinter implements ActionListener
{
  public void actionPerformed(ActionEvent event)
  {
    Date now = new Date();
    System.out.println("At the tone, the time is " + now);
    Toolkit.getDefaultToolkit().beep();
  }
}


Почему в данной строчке используется интерфейсная переменная? Почему не объектная?
Что за процесс происходит?

ActionListener listener = new TimePrinter();

    


Ответы

Ответ 1



Если в будущем вы захотите использовать не TimePrinter, а другую реализацию ActionListener? Конечно, можно делать как вам вздумается. А сделано для того, чтобы можно было на лету менять конечную реализацию (к примеру, вместо TimePrinter использовать MsecTimePrinter, т.е. другую реализацию интерфейса ActionListener). Поэтому и принято оперировать интерфейсами. Чтобы не связывать свой код жестко конкретными реализациями, т.к. в интерфейс можно присвоить любой класс, который реализует данный интерфейс. Это ПРАВИЛЬНЫЙ подход к написанию кода А процесс происходит довольно простой: вы объявляете интерфейсную переменную типа ActionListener и связываете её с объектом TimePrinter. В последующем вы используете только методы интерфейса ActionListener, что освобождает вас от знания конкретной реализации самого класса TimePrinter.

Ответ 2



То на что Вы указали есть реализация одного из принципов ООП(ООД), а конкретно "принцип подстановки Барбары Лисков". Обычно данный принцип объединяют c 4-мя другими и называют акронимом SOLID. Суть принципа заключается в следующем везде, где используют базовый тип, есть возможность использовать подтипы базового типа, при этом с точки зрения кода не имеет значения, работает ли он с базовым или дочерним типом. В приведенном примере этот принцип проявляется в двух местах: 1) ActionListener listener = new TimePrinter(); 2) Timer(10000, listener);

Комментариев нет:

Отправить комментарий