2-2: イベントの概念の拡張


・ Javaにおけるイベント(Event)の概念は、 JDKのバージョンアップに伴って少しずつ変化をとげてきました。 元々イベントは GUIに基づくアプリケーションにおいて ユーザーの入力を処理するために導入されたものです。 ユーザーが入力デバイスの操作を実行すると、 それに応じて発生したイベントが ウィンドウシステムからアプリケーションに通知されます。 アプリケーションは受け取ったイベントから必要な情報を取り出し、 それに応じた処理を実行することになります。 アプリケーションの側から見ると、 イベントはハードウェアに依存しない形式で入力情報を扱うことができます。 (事実 JDKの最初のバージョンでは、イベントを取り扱うクラスは Event という たった1種類しか存在しませんでした。)

「古典的な」イベントの概念

JDK1.1 からイベントは 継承関係を持つ複数のクラス群によって表されるようになりました。 すべてのイベントのクラスの共通のスーパークラスである EventObject は、 非常に抽象化された存在です。 具体的にウィンドウシステムの入力に関連するイベントは、 EventObject のサブクラスである AWTEventのサブクラスとして表されます。 逆に言えば、ユーザー入力とは全く無関係なイベントを定義することも可能になります。
それでは「ユーザー入力とは無関係なイベント」とは、 いったいどんなものなのでしょうか? それを知るためには、 イベントが持つ「情報を通知する」という性質に注目する必要があります。 イベントの通知は必ずしもシステムからアプリケーションへだけに限定して 考える必要はありません。 実際、アプリケーション内部でも受け取ったイベントをプログラムの内部で やり取りするのが普通です。 典型的な例が、「代理人モデル」 におけるコンポーネントとリスナ(アダプタ)のオブジェクトの間での イベントの情報の伝達です。 コンポーネントとリスナの場合は、まだ「入力の処理」の性格が強いでしょう。 しかし、もっと一般化し、任意のオブジェクトとオブジェクトの間で イベントをやり取りするようなことも可能です。 最も一般化した図式は下図のように、 イベントの送り手(Source)、送られるイベント(EventObject)、 イベントの受け取り手(Listener)というようになります。
「オブジェクトとオブジェクトが通信する」という考え方は、 オブジェクト指向プログラミングでは非常に重要です。 Javaでは特にその役割を、 拡張されたイベントの概念を通じて実現していると言うことができます。

拡張されたイベントの概念