CUBは子供の白熊

Java SE 8 実践プログラミングの練習問題を解く

第7章 Nashorn JavaScript エンジンの活用 : 問題 5 : JavaScript で Java クラスを拡張

問題

以下の JavaScript のコード

var arr = new (Java.extend(java.util.ArrayList)) {
    add : function(x) {
        print('Adding ' + x);
        return Java.super(arr).add(x)
    }
}

により、JavaArrayListクラスのaddメソッドをログ出力するように拡張した
しかし、この拡張は単一オブジェクトに対してしか機能しない

ログ出力するArrayListを何個でも生成できるようにするため、そのようなオブジェクトを生成するファクトリとなる JavaScript 関数を書け

解答

JavaScript のコード

function createArray() {
    var arr = new (Java.extend(java.util.ArrayList)) {
        add: function(x) {
            print('Adding ' + x);
            return Java.super(arr).add(x)
        }
    }
    return arr;
}

問題文にあったセンテンスを関数にしただけだが、こんなに簡単でいいのかな…

■ ファクトリ関数の呼び出し

var a = createArray();
a.add('CUB')
a.add('子供の白熊')
print(a)

上のコードを exercise5.js なるファイルに保存して、Java から呼び出してみる

JavaScriptJava で実行

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
try {
    Object result = engine.eval(Files.newBufferedReader(Paths.get("exercise5.js")));
    System.out.println(result);  // result は null
} catch (ScriptException | IOException ex) {
    ex.printStackTrace();
}