himorogiの日記

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

JavaScript functions as Java interfaces

先の Runnable の例や、様々なイベントリスナーを実装する際、メソッド1つだけのインタフェースを実装する必要がある。 そのようなインタフェースが予想されるとき、RhinoJavaScript function を pass する。 function はインタフェースメソッドの実装として call される。

ここに、簡易型のRunnableの例を示す:

js> t = java.lang.Thread(function () { print("\nrunning"); });
Thread[Thread-0,5,main]
js> t.start()
js> 
running

すべてのメソッドで同じ Signature があるなら RhinoJavaScript function を Javaインタフェースの実装のように使うことができる。 function を呼ぶとき、Rhinoは追加された引数としてメソッドの名前を渡す。 function はこれにより、どのメソッドに呼ばれたか識別できる:

js> var frame = new Packages.javax.swing.JFrame();
js> frame.addWindowListener(function(event, methodName) {
	if (methodName == "windowClosing") {     
            print("Calling System.exit()..."); java.lang.System.exit(0);
	}
    });
js> frame.setSize(100, 100);
js> frame.visible = true;
true
js> Calling System.exit()...