我正在尝试使用新添加的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中很深-感叹)。