标题中提到的功能有一个简单的目的:允许用户将一些事件侦听器绑定到一个对象,该对象将在事件发生时调度所有事件侦听器。
这个简单的概念当然可以像这样实现:
public class EventEmitter extends ArrayList<Runnable>;
但我更喜欢更智能的发射器 - 理想情况下允许将参数传递给回调。 Runnable当然没有任何参数。 Lambda表达式在另一侧有参数。
智能发射器允许您定义特定的回调参数:
EventEmitter<String, Boolean> emitter = new EventEmitter();
我的问题是这个东西是否是java库的一部分,或者我是否必须自己实现它。在谷歌上,我只发现了一些java.awt.AWTEvent
,但这不是事件调度员。
我首选的伪代码:
// Requires lambdas with (File, int) signature
public final EventEmitter<File, int> downloadCompleteEvent;
新活动添加为:
downloaderClass.downloadCompleteEvent
.addListener(
(File file, int downloadTime)->System.out.println("Downloaded "+file.getAbsolutePath()+" in "+downloadTime+" seconds.")
);
并将事件发送为:
this.downloadCompleteEvent.dispatch(downloadedFile, elapsedTime);
答案 0 :(得分:1)
在纯Java中,您可以使用代表当前状态或工作的CompletableFuture
。在可完成的未来,您可以添加一个或多个将使用result调用的侦听器。
通过示例:
public CompletableFuture<DownloadResult> download() {
// computing a result async
CompletableFuture<DownloadResult> future = CompletableFuture.supplyAsync(/* your process*/);
return future;
}
future.thenAccept( (DownloadResult) r -> { ... } );
// will be called when process is done
此外,您可以通过EventBus感兴趣进入Guava库:https://github.com/google/guava/wiki/EventBusExplained
或者RXJava图书馆:https://github.com/ReactiveX/RxJava/wiki/How-To-Use-RxJava
答案 1 :(得分:0)
某些库可能有一个可以扩展的类来添加此功能,但它不是本机java的习惯用法。如果您需要此功能,则需要通过观察者模式自行跟踪和通知事件监听器。