himorogiの日記

主にプログラミングに関することなど。少々ハード(電子工作)についても。

Implementing Java interfaces

Java のクラスにアクセスし、Java オブジェクトを作成し、それらオブジェクトのフィールド、メソッド、およびプロパティを参照することで多くの機能を直ちに利用できる。 しかし Java の多くの API で、クライアントに実装を委ねるインタフェースを提供しているため、いくつかのインスタンスではそれだけでは十分でない。この1つの例が Thread クラスである。コンストラクタは新しいスレッドが始められるとき呼ばれるただ一つのメソッド実行を含む Runnable インターフェースを取る。

この必要性を扱うため、Rhinoはインタフェースを実装する新しいJavaオブジェクトを作成する能力を提供する。まず、Java インタフェースが要求するメソッド名に一致した名前を持つ function プロパティを備えた JavaScriptオブジェクトを定義しなければない。 Runnable インターフェースを実装するには、ただ一つ、引数のない run メソッドを定義するだけでよい。第3章から覚えているなら JSONJavaScriptオブジェクトを定義できる。run メソッドで JavaScript オブジェクトを定義するために function 定義と組み合わせて JSON を使うことができる。

js> obj = { run: function () { print("\nrunning"); } }
[object Object]
js> obj.run()

running

Runnable インターフェースを作成することで Runnable インタフェースを実装したオブジェクトを作れる:

js> r = new java.lang.Runnable(obj);
[object JavaObject]

Java の実装では、インタフェースで new オペレータは使えない。 Rhino では JavaScriptオブジェクト obj の実装を用いる。 オブジェクトに Runnable インターフェースを実装させるので、Thread を生成し、実行できる。 Runnable に定義した function は新しいスレッドから呼ぶことができる。

js> t = new java.lang.Thread(r)
Thread[Thread-2,5,main]
js> t.start()
js>

running

スレッドスケジューリングに依存して、最終的なjsプロンプトと新しいスレッドからの出力は何れの順でも現れるかもしれない。場面の後ろでは、RhinoはRunnableとフォワードがすべて、電話することであると関連JavaScriptオブジェクトへの走行メソッドに実装する新しいJavaのクラスのためにバイトコードを生成します。 このクラスを実装するオブジェクトはJavaアダプターと呼ばれます。 JavaScriptへの推進がランタイムのときに起こるので、それらが呼ばれるまでインタフェースを実装するメソッドを定義するのを遅らせるのは可能です。 必要なメソッドを省略するのは、大きさでプログラムを作るための悪い習慣ですが、それは小さいスクリプトと踏査のプログラミングの役に立ちます。