Java Tip10:Javaでのコールバックルーチンの実装

MS-WindowsとX Window Systemのイベント駆動型プログラミングモデルに精通している開発者は、何かが起こったときに呼び出される(つまり、”コールバック”)関数ポインタを渡すことに慣れています。 Javaのオブジェクト指向モデルは現在、メソッドポインタをサポートしていないため、この快適なメカニズムを使用することはできないようです。 しかし、すべてが失われていません!

Javaのインターフェイスのサポートは、コールバックと同等のものを得ることができるメカニズムを提供します。 トリックは、呼び出されたいメソッドを宣言する単純なインターフェイスを定義することです。

たとえば、イベントが発生したときに通知を受けたいとします。 インターフェイスを定義することができます:

public interface InterestingEvent{ // This is just a regular method so it can return something or // take arguments if you like. public void interestingEvent ();}

これにより、インターフェイスを実装するクラスのオブジェクトを把握できます。 したがって、私たちは他の無関係なタイプの情報に関心を持つ必要はありません。 これは、MotifでC++コードを使用するときに、ウィジェットのデータフィールドを使用してオブジェクトポインタを保持するトランポリンC関数をハッキング

イベントを通知するクラスは、InterestingEventインターフェイスを実装し、必要に応じてinterestingEvent()メソッドを呼び出すオブジェクトを期待する必要があります。この例では、somethingHappened述語を使用して、イベントをトリガーする必要があるかどうかを追跡しました。 多くの場合、メソッドが呼び出されたという事実だけで、interestingEvent()シグナル伝達を保証するのに十分です。

イベント通知の受信を希望するコードは、InterestingEventインターフェイスを実装し、それ自体への参照をイベント通知器に渡すだけです。

public class CallMe implements InterestingEvent{ private EventNotifier en; public CallMe () { // Create the event notifier and pass ourself to it. en = new EventNotifier (this); } // Define the actual handler for the event. public void interestingEvent () { // Wow! Something really interesting must have occurred! // Do something... } //...}

それだけです。 私はこの単純なJavaイディオムを使用すると、Javaへの移行が少し不安定になることを願っています。

ジョン-D-ミッチェルは、カフェイン、砂糖、睡眠が少なすぎることを維持し、GeoworksでOOassembly言語のPDAソフトウェアを開発してきました。 彼はコンパイラ、Tcl/Tk、C++、Javaシステムを書いてJava中毒に資金を提供しています。 彼は新しいJavaの本”Making Sense of Java”を共著し、現在Javaコンパイラを開発しています。

コメントを残す

メールアドレスが公開されることはありません。