Closure の文法(別案)
この提案は、匿名クラスの延長としてClosureが使えていいっすね。無茶な文法導入しなくていいし、以前の資産が活かせそう。(例えばSwing、AWTのイベントリスナーとか)
Concise Instance Creation Expressions: Closures without Complexity
- インタフェース(とか抽象クラス)に抽象メソッド一個しか定義してなかったら、匿名クラス側でメソッドの宣言部分を省略できる。
- local変数にpublic付けるとEnclosing Scopeから自由にアクセス(書き込み含む)できるようにする?
- 引数はクラス名の後ろの括弧のところに書く。
- 上記機能使うときはnewを省略
new Thread(new Runnable() { public void run() { foo(); } }).start( とか static <T> Comparator<T> reverseOrder(final Comparator<T> cmp) { return new Comparator<T>() { public int compare(T t1, T t2) { return cmp.compare(t2, t1); } }; }
↑こういうのを↓こうかける
new Thread(Runnable(){foo();}).start(); とか static <T> Comparator<T> reverseOrder(Comparator<T> cmp) { return Comparator<T>(T t1, T t2){ return cmp.compare(t2, t1); }; }
あぁ、これってRhinoの「JavaScript functions as Java interfaces」機能と似ている。
この機能でも匿名クラスで実装すべきメソッドが一個のときには、簡潔にブロックっぽく書ける。
js> t = java.lang.Thread(function () { print("\nrunning"); }); Thread[Thread-0,5,main] js> t.start() js> running