Прослушивание (регистрация) определенного метода интерфейса без реализации всех методов Java - PullRequest
0 голосов
/ 22 февраля 2019

Интерфейсы - хороший способ имитировать обратные вызовы.Однако класс, который реализует интерфейс, должен переопределить все методы этого интерфейса.
Теперь у меня есть интерфейс

interface MyInterface {
    void callback1();
    void callback2();
    void callback3();
    ...
    void callback100();
}

Я хочу сделать слушатель, который регистрируется только для callback1 ().Есть ли способ прослушать такое событие, не реализовав весь интерфейс MyInterface?

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Вот почему рекомендуется поддерживать максимально простые интерфейсы (и желательно использовать существующие интерфейсы, где это возможно).

Ваш пример интерфейса с 100 методами известен в экспертных кругах как "Плохой дизайн".».Это почти автоматически приводит к плохому коду.

0 голосов
/ 22 февраля 2019

В качестве альтернативы методу Java 8 default вы можете взглянуть на классы Adapter, используемые в слушателях Swing.Это подкласс, который обеспечивает пустое тело для всех методов интерфейса.Это позволяет различать случаи, когда вы хотите получить четкое определение всех тел методов, а случай, когда вы не хотите иметь поведение для всех них.

Например:

interface MyCallback {
    void callback1();
    void callback2();
    void callback3();
}

И класс адаптера:

public class MyAdapter implements MyCallback {
    public void callback1(){}
    public void callback2(){}
    public void callback3(){}
}

Теперь клиентские классы могут использовать интерфейс или класс адаптера для реализации обратного вызова:

MyCallBack callback = new MyAdapter(){
        public void callback2(){
           // I implement it only
        }
}

Или:

MyCallBack callback = new MyCallBack(){
        // I have to implement all
        public void callback1(){
          // ...
        }
        public void callback2(){
          // ...
        }
        public void callback3(){
          // ...
        }
}
0 голосов
/ 22 февраля 2019

Вы можете пометить методы, которые не нужно реализовывать, как default и дать им пустое тело.Например:

public class Main {

    public static void main(String[] args) {
        I i = new A();
        i.f();
    }
}

interface I {
    default void f() {}
    default void g() {}
}

class A implements I {
    @Override
    public void f() { // only implementing "f"
        System.out.println("Hello");
    }
}

Если вы не можете использовать функции Java 8, вы можете создать отдельный интерфейс для каждого обратного вызова:

interface Callback1Listener {
    void callback1();
}

interface Callback2Listener {
    void callback2();
}

interface Callback3Listener {
    void callback3();
}

// ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...