yojikのlog

yojikのブログです

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