【发布时间】:2017-08-22 17:41:44
【问题描述】:
我的类实现了多个具有相同默认默认方法的接口。我想知道如何从所有接口组合默认方法。例如:
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()。如果接口列表很长,把它们都写出来是很痛苦的。此外,我可能有不同的类来实现不同的接口组合。是否有其他语法糖/设计模式/库可以让我自动完成?
更新:与复合模式比较
复合图案也相当可观。但是我想使用默认方法作为 mixin 来给类提供不同的行为,而复合模式在这里没有给我静态类型检查。复合模式还引入了额外的内存占用。
【问题讨论】:
-
是否需要使用默认值?你能改变你的界面吗?
-
你确定这个类不应该委派到一个List
,IA、IB等会扩展处理器吗?然后你只需使用一个循环。 -
没有简单的方法可以让 Java 自动为您完成这项工作。您可能可以通过反射来做到这一点(检查类实现了哪些接口,然后通过反射调用每个接口的
process方法),但这将是复杂和笨重的。有不同的更好的方法,看看其他人的建议。 -
这看起来有点滥用
default方法的设计目的。我建议你在决定走这条路之前阅读this。
标签: java design-patterns java-8 default-method