Groovy 1.8.0 beta 2 から@Field*1というAST変換アノテーションが使えるようになっています。これは何かといいますと、いままではスクリプト中で
int x = 3 def y() { println x } y()
の様に書くとエラーになっていました。なぜならxは、このスクリプトが実行されるにあたって暗黙に生成されるScriptクラスを継承したクラスのrunメソッドのローカル変数だったからです。
つまり、上がtest.groovyで保存されてたとして、
class test extends Script { Object y() { System.out.println(x); // (1) } public void run() { int x = 3; y(); } }
こんな風なコードと等価なわけですが、(1)でxが参照できないというエラーになります。
さて、@Fieldですが、これは
import groovy.transform.Field; @Field int x = 3 def y() { println x } y()
こんな風につかいます。この場合、
class test extends Script { int x = 3; Object y() { System.out.println(x); } public void run() { y(); } }
こんなコードと等価になるわけです。xがローカル変数ではなくスクリプトクラスのフィールドになるため、y中から参照しても問題ありません。
多用することになりそうなAST変換アノテーションです。
*1:Groovy 1.8.0 beta1 では@ScriptFieldという名前だったが@Fieldに変更された。