#概要
Groovyでは、インスタンスメソッドをクロージャに変換する機能があります。
方法は簡単で、 ".&" という特殊な記号を使います。
例えば、hogeというオブジェクトのpiyoというメソッドをクロージャに変換するには以下のようにします。
def clos = hoge.&piyo
メソッドのpiyoにカッコ()は必要ありません。
これでpiyoメソッドがクロージャに変換されて、clos変数に格納されます。
ちなみに、clos変数の型(メソッドをクロージャに変換した結果の型)厳密に言うとClosure型ではなくて、MethodClosure型になります。
MethodClosureクラスはClosureクラスを継承しているので、Closureとして振る舞えます。
MethodClosureオブジェクト(今回の場合clos変数)は、元のhogeオブジェクトの参照を持っているので、hogeオブジェクトのプロパティを変更すれば、closの実行結果も変化させることができます。
使い方
ソースを見るのが手っ取り早い
class Test {
def str = "string"
def num = 1
def hoge(){
println "execute hoge()"
"${str} from hoge method"
}
def piyo(Integer i) {
println "execute piyo()"
num + i
}
}
// インスタンスの生成
def obj = new Test()
// インスタンスのメソッドをクロージャに変換
def clos = obj.&hoge
assert clos() == "string from hoge method"
// objインスタンスへの参照を持っているので、objのプロパティを変更すればすでにクロージャに変換しているものの実行結果も変化する。
obj.str = "change"
assert clos() == "change from hoge method"
// 引数が必要なメソッドをクロージャに変換。やり方は一緒。
def clos2 = obj.&piyo
// 実行時に引数を渡してあげればOK
assert clos2(100) == 101
#使い所
GrailsのInterceptionで利用するので、確かにあれば便利な機能だな、というのは解る。
けど自分で使うシチュエーションは思い浮かばない。。。