JavaScriptでいうところのデータ型としての関数(たぶん関数オブジェクトって呼ぶのかな)みたいのをJavaでできないかと思って書いてみたけど、やっぱあんま面白くないや。
こんな単純なコードですら実行時間がかかりすぎるし、第一、全然簡潔じゃないから意味がない感じ。
関数オブジェクトを実行する側
package foo; public class Caller { public static void call(Object object, Object[] params) { Class[] clazzes = null; if (params != null) { clazzes = new Class[params.length]; for (int i = 0; i < clazzes.length; i++) { clazzes[i] = params[i].getClass(); } } try { object.getClass().getMethod("callee", clazzes).invoke(object, params); } catch (Exception e) { throw new RuntimeException(e); } } }
関数オブジェクトを使う側
package foo; import java.util.ArrayList; import java.util.List; public class Callee { public static void main(String[] args) throws Exception { // simple function object List<Object> list = new ArrayList<Object>(); String[] colors = { "red", "blue", "green", "yellow", "black", }; for (final String color : colors) { Object obj = new Object() { public void callee() { System.out.println("call:" + color); } }; list.add(obj); } for (Object object : list) { Caller.call(object, null); } System.out.println(""); // paramatered function object Object obj = new Object() { public void callee(String arg) { System.out.println("variabled arg:" + arg); } }; String[] aa = { "Yeah!", }; Caller.call(obj, new String[] { "Yeah!", }); Caller.call(obj, new String[] { "Haaaah!", }); } }
これを実行するとこんな感じ。
call:red call:blue call:green call:yellow call:black variabled arg:Yeah! variabled arg:Haaaah!
一応、ぽいい感じにはなってる。