2007/02/13

Javaのためのクロージャ(v0.5)

Java What's Newより。
将来のJavaに入るかもしれない、クロージャ仕様の新版(v0.5)が公開されてます。
Closures for the Java Programming Language

クロージャとは、遅延実行されるパラメータ化されたコードブロックです(上記リンク先より)。クロージャがあることによって、今まで匿名クラスを作成して書いてたような処理がより簡単に書けます。ま、早い話が、特定のインターフェースを継承した匿名クラス定義の短縮構文です。

例えば、intを2つ引数にとり、それらを加算して返すものは次のように記述されます。

{int x, int y => x + y}

こいつも型を持っていて、その型は次のように表現されます。

{int, int => int}

なので、

{int, int => int} calc = {int x, int y => x + y};
calc.invoke(3, 5); // 8
calc = {int x, int y => x - y};
calc.invoke(3, 5); // -2

てなことになります。

背後には当然Javaの型システムが働いていて、クロージャに対応するインターフェースがコンパイラにより生成され(synthetic付き)ます。

上記リンク先を深く見ていくと、いろいろニヤリとさせられるトピックが検討されてます。同じシグネチャのクロージャ間の互換性とか、例外のサポートとか、Unreachableとか、Genericsとの関係とか。Open Issues(v0.5)には、リフレクションやvolatile、末尾再帰はどうしようかみたいなことも挙げられてます。

いや、当初はまたXMLリテラル並のゴテゴテした機能追加だと思って嫌だったんだけど、仕様を見ると非常に興味深い議論が重ねられてて、俄然興味が沸いてきました。是非Java7に搭載して欲しい。

0 件のコメント: