データ型としての関数のまねごと

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!

一応、ぽいい感じにはなってる。