yojikのlog

yojikのブログです

Javaでクロージャ改良案

プログラマー日記(2006-01-04)

むむ。もうちっとシンプルかつオサレにかける気がする。
匿名クラスから外側のローカル変数やメソッド引数にアクセスする場合は、ローカル変数や引数にfinal修飾子をつければ良い。外側に持ち出したローカル変数の参照が付け替えられるとマズいのでこの制約がある。これで文法的には冴えないけど、ローカルなコンテキストを持ち運ぶという意味ではクロージャになる。
さらに可変長引数とジェネリックスがあるので最近では結構素敵に書ける。インタフェース定義する必要があるのと、引数のキャストが必要になる以外はそこそこイケてると思う。

public interface Func<T> {
    T exec(Object... obj);
}
public class Test {
    public static void main(final String[] mainargs) {
        //メイン引数、自身のメソッド引数の個数を答える意味無い関数
        Func<String>  f  = new Func<String>() {
            public String exec(Object... arg) {
                return "mainの引数の長さは"+ mainargs.length +
                       " クロージャの引数は"+ arg.length ;
            }
        };
        System.out.println(f.exec("hoge","hoge"));
    }
}

昔から思うけど、匿名クラスは結構面白いと思う。北欧のオブジェクト指向言語BETAから来たって昔聞いたことがある。北欧出身なんてオサレじゃん。ガセビアだったら申し訳ないデス。