Java 8';默认值';接口-我们应该有循环默认实现吗?
Java 8引入了一个名为default methods的新功能,如下所示:Java 8';默认值';接口-我们应该有循环默认实现吗?,java,interface,Java,Interface,Java 8引入了一个名为default methods的新功能,如下所示: interface A { default int getInt() { return 0; } } 但是,如果我们添加多个方法: class Event{...} class EventA extends Event{...} class EventAData{} interface A { default void handleEvent(Event event) {
interface A {
default int getInt() {
return 0;
}
}
但是,如果我们添加多个方法:
class Event{...}
class EventA extends Event{...}
class EventAData{}
interface A {
default void handleEvent(Event event) {
if(event instanceof EventA) {
handleData(((EventA) event).getData());
}
}
default void handleData(EventAData data) {
handleEvent(new EventA(data));
}
}
handleEvent()
检查事件是否属于EventA类,默认情况下实现处理EventA的旧方法handleData()
将数据转换为事件,并使用超级新方法handleEvent()
处理数据
我看到的问题是,当这两个方法都没有实现时,这两个方法会互相调用,导致堆栈溢出错误。我可能会使用反射来检查调用方是否是默认的handleEvent()
,如果是则返回
这样做可以吗?若否,原因为何
编辑:修复了一个打字错误,
handleEventA
应该是handleData
否。这是个糟糕的主意。提供崩溃的默认实现是很糟糕的。您也无法通过反射计算出方法的调用方是如何工作的。这是一个更糟糕的想法。等等,handleEventA
在您的代码中定义在哪里?这个实现肯定不好,您正在假设接口的客户端应该如何使用它,并以一种错误使用会破坏默认实现的方式对其进行结构化。@Boristeider我同意提供崩溃的默认实现是个坏主意,但我相信我能以某种方式解决堆栈溢出问题。您的问题不值得采用适配器模式吗?