Java是否具有提升或Qt信号的等效性?

时间:2016-01-05 04:46:55

标签: java

标题中提到的功能有一个简单的目的:允许用户将一些事件侦听器绑定到一个对象,该对象将在事件发生时调度所有事件侦听器。

这个简单的概念当然可以像这样实现:

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

2 个答案:

答案 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的习惯用法。如果您需要此功能,则需要通过观察者模式自行跟踪和通知事件监听器。