2016-01-05 26 views
0

title中提到的特性提供了一个简单的目的:允许用户将一些事件监听器绑定到一个对象,该对象将在发生事件时分派所有事件监听器。Java是否具有提升或Qt信号的等价性?

这个简单的概念可以,当然,取得这样的:

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

回答

1

在纯Java中,您可以使用CompletableFuture表示当前正在执行的状态或工作。在一个可以实现的未来,您可以添加一个或多个将被调用的侦听器。

举例:

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有兴趣到番石榴库:https://github.com/google/guava/wiki/EventBusExplained

或者通过RXJava库:https://github.com/ReactiveX/RxJava/wiki/How-To-Use-RxJava

+0

我假设'CompletableFuture'仅供一次使用。 –

+0

您可以在一个可完成的将来添加多个侦听器/回调,也可以链接进程,但是您需要为每次执行创建一个新的未来,是 – Prim

+0

非常感谢,我将尝试使用此信息。如果你想到别的什么,我会很感激。 –

0

一些图书馆可能有一个类,可扩展来增加这个功能,但它不是一个原生的java成语。如果你想要这个功能,你需要通过观察者模式来跟踪和通知事件监听器。

+0

我需要更多的信息,你能添加一些答案? awt如何做? –

相关问题