1. 概要

Guavaライブラリは、コンポーネント間のパブリッシュ/サブスクライブ通信を可能にするEventBusを提供します。 このチュートリアルでは、EventBusのいくつかの機能の使用方法を見ていきます。

2. 設定

まず、 pom.xml:にGoogleGuavaライブラリの依存関係を追加します

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>
最新バージョンはここにあります。

3. EventBusを使用する

簡単な例から始めましょう。

3.1. 設定

まず、EventBusオブジェクトを確認します。 リスナーを登録し、イベントを投稿できます。 これを使用するのは、クラスをインスタンス化するのと同じくらい簡単です。

EventBus eventBus = new EventBus();

Guavaライブラリを使用すると、開発ニーズに最適な方法でEventBusを自由に使用できます。

3.2. リスナーの作成

特定のイベントを受信するためのハンドラーメソッドを持つリスナークラスを作成します。 ハンドラーメソッドに@Subscribeのアノテーションを付けます。 このメソッドは、投稿されているイベントと同じタイプのオブジェクトを引数として受け入れます。
public class EventListener {

    private static int eventsHandled;

    @Subscribe
    public void stringEvent(String event) {
        eventsHandled++;
    }
}

3.3. リスナーの登録

EventBusEventListener クラスを登録することで、イベントをサブスクライブできます。
EventListener listener = new EventListener();
eventBus.register(listener);

3.4. リスナーの登録を解除する

何らかの理由でEventBusからクラスの登録を解除したい場合は、次のようにすることも簡単にできます。

eventBus.unregister(listener);

3.5. イベントの投稿

EventBusを使用してイベントを投稿することもできます。
@Test
public void givenStringEvent_whenEventHandled_thenSuccess() {
    eventBus.post("String Event");
    assertEquals(1, listener.getEventsHandled());
}

3.6. カスタムイベントの投稿

カスタムイベントクラスを指定して、そのイベントを投稿することもできます。 まず、カスタムイベントを作成します。
public class CustomEvent {
    private String action;

    // standard getters/setters and constructors
}

そのイベントのEventListenerクラスにハンドラーメソッドを追加します。

@Subscribe
public void someCustomEvent(CustomEvent customEvent) {
    eventsHandled++;
}

これで、カスタムイベントを投稿できます。

@Test
public void givenCustomEvent_whenEventHandled_thenSuccess() {
    CustomEvent customEvent = new CustomEvent("Custom Event");
    eventBus.post(customEvent);

    assertEquals(1, listener.getEventsHandled());
}

3.7. 未購読イベントの処理

DeadEvent クラスが提供されており、リスナーのないイベントを処理できます。 DeadEventクラスを処理するメソッドを追加できます。

@Subscribe
public void handleDeadEvent(DeadEvent deadEvent) {
    eventsHandled++;
}

4. 結論

このチュートリアルでは、Guava EventBusの使用方法に関するガイドとして簡単な例を使用しました。

この記事の完全なソースコードとすべてのコードスニペットは、GitHubにあります。