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();
}
}