長いので2回続きとなります。今回は準備だけ。
3. Javaのインタフェースを実装する
interfaceを扱うJavaのフレームワーク内に、JavaScriptで実装したインスタンスを流すと言うRhinoの利用法です。Javaのフレームワークは堅固な開発ができると同時に、JavaScriptの実装部はコンパイルなしで自由に変えられるので、大変便利です。
今回は、Chefに料理を作らせて対決させると言う想定のフレームワークを作ってみます。まずは、フレームワーク内を流すinterfaceを定義します。自己紹介と、焼く、煮る、切る、そして仕上げを実行することができるインタフェースです。
package jstest; public interface Chef { public void introduce(); public void fry(String food); public void boil(String food); public void cut(String food); public void finish(); }
これは後からJavaScriptで実装しますが、イメージがわかりやすいようにJavaの実装も用意しておきます。
class JavaChef implements Chef{ public void introduce() { System.out.println("Javaさんの出番です。"); } public void boil(String food) { System.out.println(food + "をボイルした。"); } public void cut(String food) { System.out.println(food + "をカットした。"); } public void fry(String food) { System.out.println(food + "を焼いた。"); } public void finish() { System.out.println("完成した。"); }
このシェフに働いてもらう台所を作成します。今回はカレーとミートソースをシェフ達に作ってもらいます。
package jstest; import java.util.ArrayList; public class Kitchen { private final ArrayList<Chef> chefs; public Kitchen(ArrayList<Chef> chefs){ this.chefs = chefs; } public void run(){ System.out.println("【カレー対決】"); for(Chef chef : chefs){ makeCurry(chef); System.out.println(); } System.out.println("【ミートソース対決】"); for(Chef chef : chefs){ makeBolognese(chef); System.out.println(); } } public void makeCurry(Chef chef){ chef.introduce(); chef.cut("じゃがいも、豚肉"); chef.fry("じゃがいも、豚肉"); chef.boil("ルー、じゃがいも、豚肉"); chef.finish(); } public void makeBolognese(Chef chef){ chef.introduce(); chef.boil("パスタ"); chef.cut("たまねぎ"); chef.fry("トマトソース、挽肉、たまねぎ"); chef.finish(); } }
テストとして、以下のようなメインルーチンを作って実行してみます。
public static void main(String[] args) throws Exception { ArrayList<Chef> chefs = new ArrayList<Chef>(); chefs.add(new JavaChef()); Kitchen kitchen = new Kitchen(chefs); kitchen.run(); } [結果] 【カレー対決】 Javaさんの出番です。 じゃがいも、豚肉をカットした。 じゃがいも、豚肉を焼いた。 ルー、じゃがいも、豚肉をボイルした。 完成した。 【ミートソース対決】 Javaさんの出番です。 パスタをボイルした。 たまねぎをカットした。 トマトソース、挽肉、たまねぎを焼いた。 完成した。
これでフレームワークは完成です。長いので次のエントリに続きます。
*1:例外処理は適当ですよ