By-Name ParametersでJavaライクなsynchronizedを作る
「By-Name Parameters」を使うと、
foo { println("aaaa") }
みたいな感じで呼び出せる関数を作成できます。関数fooの定義は以下のような感じ。
def foo[R]( proc: => R ):R = { try { println("before...") proc // 引数のprocを評価して実行 } finally { println("after...") } }
実行結果です。
before... aaaa after...
これを使って、Javaライクなsynchronized関数を作ってみました。(まぁ、特にメリットはないんですけど。)
def synchronized[R]( obj:AnyRef )( proc: => R ):R = { obj.synchronized { proc } }
次のような感じで呼び出せます。
val obj = new java.lang.Object synchronized( obj ) { println("aaaa") }