我正在尝试使用新添加的 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();
}
}
据我了解,我必须定义一个通用的空接口(interface),例如,public interface Listener {//此处什么都没有}
,并通过每种事件类型的各种其他接口(interface)扩展它所以我可以在需要时指定不同的参数和返回类型。
显然,这需要将回调转换为 EventEngine 的触发方法内的特定接口(interface),但我对此没有问题。
但是,在此之前,我需要了解如何引用我为 EventDispatcher.listen
方法定义的这些私有(private)方法。 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
。
并且您需要具有与回调具有相同签名的一个抽象方法的功能接口(interface)。
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预定义的,您应该需要学习。例如,在这里,人们不需要自己的接口(interface)。
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 - 叹息)。
关于使用 lambdas/方法引用的 java 8 事件监听器/调度程序 - 如何实现某些事情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24285861/