Javaのヒント10:Javaでコールバックルーチンを実装する

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

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

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

public interface InterestingEvent {//これは単なる通常のメソッドなので、必要に応じて何かを返すか、//引数を取ることができます。public void InterestEvent(); }

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

イベントを通知するクラスは、InterestingEventインターフェースを実装するオブジェクトを予期し、必要に応じてinterestingEvent()メソッドを呼び出す必要があります。

public class EventNotifier {private InterestingEvent ie; プライベートブールsomethingHappened; public EventNotifier(InterestingEvent event){//後で使用するためにイベントオブジェクトを保存します。すなわち=イベント; //まだ報告するものはありません。someHappened = false; } // ... public void doWork(){//他の場所で設定されている述語を確認します。if(somethingHappened){//インターフェイスのメソッドを呼び出して偶数を通知します。ie.interestingEvent(); } // ...} // ...}

その例では、somethingHappened述語を使用し、イベントをトリガーする必要があるかどうかを追跡しました。多くの場合、メソッドが呼び出されたという事実は、interestingEvent()のシグナリングを保証するのに十分です。

イベント通知の受信を希望するコードは、InterestingEventインターフェースを実装し、それ自体への参照をイベント通知機能に渡す必要があります。

パブリッククラスCallMeはInterestingEvent {private EventNotifieren;を実装します。public CallMe(){//イベント通知機能を作成し、それに自分自身を渡します。en = new EventNotifier(this); } //イベントの実際のハンドラーを定義します。public void InterestEvent(){//うわー!本当に面白いことが起こったに違いありません!//何かをする...} // ...}

これですべてです。この単純なJavaイディオムを使用することで、Javaへの移行のジッターが少し少なくなることを願っています。

John D. Mitchellは、カフェイン、砂糖、睡眠不足に悩まされており、過去9年間のほとんどのコンサルティングを行っており、GeoworksでOOアセンブリ言語のPDAソフトウェアを開発してきました。彼は、コンパイラ、Tcl / Tk、C ++、およびJavaシステムを作成することにより、Java中毒に資金を提供しています。彼は、最新のJavaブックMaking Sense of Javaを共著し、現在Javaコンパイラーを開発しています。

このストーリー「Javaのヒント10:Javaでのコールバックルーチンの実装」は、もともとJavaWorldによって公開されました。