torutkのブログ

ソフトウェア・エンジニアのブログ

EventBusライブラリ情報のアップデート他(メモ)

で紹介したEventBusは安定して使えていますが、新機能の開発は止まっています。

その後、たまにEvent Busライブラリの情報を探していますが、2012年11月の次のブログでいくつかのイベントバス・ライブラリの機能・性能比較を紹介しているのを見つけました。

このブログで比較されているイベントバス・ライブラリは次のとおりです。

  • Google Guava Event Bus
  • Simple Bus
  • EventBus
  • MBassador

機能はEventBusとMBassdarがほぼ同等、性能はMBassadarが圧倒的、という紹介内容ですが、このブログの主は、「MBassador」を開発している人でした。

ブログのコメントにて、EventBusの後継ライブラリであるMycilaがあるよと情報が投稿されていたので、Mycilaを探してみました。コメント中のURLは404だったので周辺探ると見つかりました。

EventBusをベースにJavaのconcurrentフレームワークを使って強化したなどの改善が施されているようです。

イベントバスを使う理由

パッケージ間の依存関係は、片方向にするのが設計原則です。すると、依存される側が依存する側にイベントの発生を通知するには、オブザーバーパターン(Javaだとリスナーインタフェースを使う実装が多い)を使うことが定番ですが、これは結構手間なプログラミングが必要です。
(リスナーリストの管理をWeak Referenceにしないとメモリリークにつながるとか、リスナーの追加削除と通知はマルチスレッドを考慮して排他等の処置を講じるとか、・・・)

イベントバスを使うと、パッケージ間の依存関係を相互参照にせず、個別にリスナーの仕組みを作りこまずに、マルチスレッド環境でも(これはライブラリによる)通知を使うことができます。

また、SwingなどのGUIライブラリは必ずGUIスレッドで呼ぶ必要がありますが、EventBusなどは通知時にスレッド乗換をサポートしているのでSwingUtilities.invokeLater()などを使って毎回スレッド乗換をコーディングしなくてもすむというメリットもあります。