Groovy中的全局常量

通常需要在脚本的顶部声明常量,这个脚本可以在脚本的其他地方引用。 在Groovy中,似乎如果使用final来声明一个常量,那么它在子范围内是不可访问的。 这个非常基本和普遍的要求是什么解决scheme? 我现在的解决方法是创build一个未绑定的variables,但这不是一个常量,并不优雅。

Groovy并没有真正的全球范围。 当你有一个没有声明一个类的groovy脚本时,它隐含地被脚本的名字卡在一个类中。 因此,顶级范围的最终variables实际上只是隐式类的字段。 例如:

// foo.groovy final MYCONSTANT = "foobar" println MYCONSTANT class Helper { def hello() { println MYCONSTANT } // won't work } new Helper().hello() 

或多或less相当于:

 class foo { def run() { final MYCONSTANT = "foobar" println MYCONSTANT new Helper().hello() } static main(args) { new foo().run() } } class Helper { def hello() { println MYCONSTANT } // won't work } 

很容易看出为什么它不起作用。 一个简单的解决方法就是在一个名为Constants的虚拟类中声明你的“全局variables”,然后对其进行静态导入。 它甚至可以在一个脚本中运行。 例:

 import static Constants.* class Constants { static final MYCONSTANT = "foobar" } println MYCONSTANT class Helper { def hello() { println MYCONSTANT } // works! } new Helper().hello() 

编辑:

另外,脚本是一个特殊的情况。 如果你声明一个没有def的variables,或者像final这样的修饰符,(也就是使用它),它将进入脚本范围的绑定。 所以在这种情况下:

 CONSTANT = "foobar" println "foobar" 

CONSTANT是在脚本范围内的绑定,但在:

 final CONSTANT = "foobar" println "foobar" 

CONSTANT是脚本run()方法中的局部variables。 有关这方面的更多信息,请访问https://web-beta.archive.org/web/20150108090004/http://groovy.codehaus.org/Scoping+and+the+Semantics+of+%22def%22

在Groovy 1.8+中,可以使用@Field注解来实现这一点:

 import groovy.transform.Field @Field final String MY_CONSTANT = 'constant' def printConstant() { println MY_CONSTANT } printConstant() 
Interesting Posts