Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8';默认值';接口-我们应该有循环默认实现吗?_Java_Interface - Fatal编程技术网

Java 8';默认值';接口-我们应该有循环默认实现吗?

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) {

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) {
        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我同意提供崩溃的默认实现是个坏主意,但我相信我能以某种方式解决堆栈溢出问题。您的问题不值得采用适配器模式吗?