Java 8: автоматическая компоновка методов по умолчанию для нескольких интерфейсов

У меня есть класс реализует несколько интерфейсов, которые имеют один и тот же метод по умолчанию. Мне интересно, как я могу составить метод по умолчанию из всех интерфейсов. Например:

interface IA {
    default void doA() {} 
    default void process() { 
        // do something 
    }
}

interface IB { 
    default void doB() {}
    default void process() { 
        // do something 
    }
}

interface IC {
    default void doC() {} 
    default void process() { 
        // do something 
    }
}

// other similar interfaces
....    

class MyClass implements IA, IB, IC, ... {
    public void process() {
       // question: how to avoid iterate all the interfaces? 
       IA.super.process();       
       IB.super.process();
       IC.super.process();
       ...
    }
}

class AnotherClass implements IA, ID, IF, IH, ... {
    public void process() {
        IA.super.process();
        ID.super.process();
        IF.super.process();
        IH.super.process();
        ...
    }
}

В реализации метод просто составление process() со всех интерфейсов. Однако я должен позвонить IA.super.process(), IB.super.process(), IC.super.process() в явном виде. Если список интерфейсов длинный, писать их все мучительно. Также у меня могут быть разные классы для реализации разных комбинаций интерфейсов. Есть ли другой синтаксис Sugar / Design Pattern / Library, который позволяет мне делать это автоматически?

Обновление: сравнить с композитным рисунком

Композитный рисунок также значительный. Но я хочу использовать метод по умолчанию в качестве mixin, чтобы дать классам различное поведение, в то время как составной шаблон здесь не дает мне статическую проверку типов. Составной шаблон также вносит дополнительный объем памяти.

1 ответ

Я думаю, что ваша ошибка заключается в определении нескольких интерфейсов, которые фактически идентичны (за исключением различного поведения по умолчанию). Это кажется неправильным в моей голове и нарушает СУХОЙ.

Я бы структурировал это, используя составной шаблон:

interface Processable
{
    void process();
}
public interface IA extends Processable //and IB, IC etc.
{
    default void doA()
    {
        // Do some stuff
    }
}


final class A implements IA
{
    void process() { /* whatever */ }
}


class Composite implements IA //, IB, IC etc. 
{
    List<Processable> components = Arrays.asList(
         new A(), new B(), ...
    );

    void process()
    {
         for(Processable p : components) p.process();
    }
}
Другие вопросы по тегам