我正在尝试使用新添加的lambda用Java编写事件引擎。如果以下代码可以工作,我将非常喜欢它:

public class Test
{
    public Test()
    {
        EventEngine.listen(EventType.THIS, self::thisEventCallback);
        EventEngine.listen(EventType.THAT, self::thatEventCallback);
        EventEngine.listen(EventType.OTHER, (other) -> other.doX());
    }

    private void thisEventCallback()
    {
        // do whatever here
    }

    private boolean thatEventCallback(SomeObject parameter)
    {
        return parameter.someCheckOrWhatever();
    }
}


据我了解,我将必须定义一个通用的空接口,例如public interface Listener {// nothing here},并通过每种事件类型的各种其他接口对其进行扩展,以便在需要时可以指定不同的参数和返回类型。
显然,这需要将回调强制转换为EventEngine的触发方法内的特定接口,但是我对此没有任何问题。

但是,在此之前,我需要找出如何引用已定义到EventDispatcher.listen方法的这些私有方法。 self::thisEventCallback不起作用。在Java 8中甚至可以做到这一点,还是只能在Scala中实现?

如果不是,那么您会提出什么建议而不涉及为每个侦听器/回调创建一个新对象呢?

最佳答案

    EventEngine.listen(EventType.THIS, this::thisEventCallback);
    EventEngine.listen(EventType.THAT, this::thatEventCallback);
    EventEngine.listen(EventType.OTHER, (other) -> other.doX());


所以this而不是self

并且您需要具有一种抽象方法的功能接口,该抽象方法具有与回调相同的签名。

public interface THISInterface {
    public void thisEventCallback();
}

public interface THATInterface {
    public boolean thatEventCallback(SomeObject parameter)
}

class EventEngine {
    public void listen(Type t, THISInterfcace thisCallback) {
        thisCallback.thisEventCallback();
    }
    public void listen(Type t, THATInterfcace thatCallback) {
        boolean ok = thatCallback.thatEventCallback();
    }
    ...
}


但是,已经有许多functional interfaces预定义,您需要学习这些预定义。例如,这里不需要自己的接口。

class EventEngine {
    public void listen(Type t, Consumer<Void> thisCallback) {
        thisCallback.accept();
    }
    public void listen(Type t, Predicate<Void> thatCallback) {
        boolean ok = thatCallback.test();
    }


以上内容是否正确,我不确定(目前在Java 6中很深-感叹)。

09-30 15:06
查看更多