static変数にも@Fieldを指定できる
Groovyでstatic変数を@Fieldにしたくなる時があります(@Fieldについてはこちらを参照)。たとえば、
class Hoge { def method() { if (verbose) { .. } } } verbose = cli.parse(args).verboes
はエラーになります。なぜなら、バインディング変数は他のクラスから可視ではないからです。ローカル変数はもちろん駄目。@Fieldを指定した変数(=フィールド、インスタンス変数)でも駄目です。なぜなら、Hogeのメソッドからscriptクラスのインスタンスを取得できないからです。
こういうときは、verboseがスクリプトのクラスのstaticフィールドであれば良いわけで、verboseをstatic変数にした上で@Fieldを指定すると実現できます。
具体的には、上がtest.groovyであれば、
class Hoge { def method() { if (test.verbose) { .. } } } @Field static verbose verbose = cli.parse(args).verboes
のように書けます。ただしstatic変数に付与することができるかどうかは、APIリファレンスにも書いてないので、正式な機能かどうかは不明です。
ちなみに、
@Field static verbose = cli.parse(args).verboes
だとエラーになります。static変数の初期化のタイミングではcli.parseは実行できないからです。
「プログラミングGROOVY」の書籍にはこのネタは書けませんでした。なぜならstatic変数に付与できるということは昨日知ったので。