uehaj's blog

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

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変数に付与できるということは昨日知ったので。