uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

Fieldアノテーションって何?

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に変更された。