2016-01-05 25 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如何做? –

相關問題