通常需要在脚本的顶部声明可在脚本中的任何其他位置引用的常量。在Groovy中,似乎如果您使用FINAL声明一个常量,那么它在子范围内是不可访问的。对于这一非常基本和常见的要求,解决方案是什么?我现在的解决办法是创建一个未绑定的变量,但这不是常量,也不是很好。
6rqinv9w1#
Groovy并没有真正的全球范围。当您有一个没有声明类的groovy脚本时,它会隐式地停留在一个带有脚本名称的类中。因此,顶级作用域中的最终变量实际上只是隐式类的字段。例如:
// foo.groovy final MYCONSTANT = "foobar" println MYCONSTANT class Helper { def hello() { println MYCONSTANT } // won't work } new Helper().hello()
或多或少相当于:
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的伪类中声明您的“全局变量”,然后对其执行静态导入。它甚至可以在一个脚本中完成所有工作。示例:
import static Constants.* class Constants { static final MYCONSTANT = "foobar" } println MYCONSTANT class Helper { def hello() { println MYCONSTANT } // works! } new Helper().hello()
此外,脚本也是一种特殊情况。如果声明一个没有def或任何修饰符(如final)的变量(即只使用它),它将进入脚本范围的绑定。因此,在这种情况下:
def
final
CONSTANT = "foobar" println "foobar"
CONSTANT在脚本范围绑定中,但在:
CONSTANT
final CONSTANT = "foobar" println "foobar"
CONSTANT是脚本的run()方法中的局部变量。有关这方面的更多信息,请参见Groovy - Scoping and the Semantics of "def"页面的存档链接。
run()
jtw3ybtb2#
在Groovy 1.8+中,您可以使用@Field annotation:
@Field
import groovy.transform.Field @Field final String MY_CONSTANT = 'constant' def printConstant() { println MY_CONSTANT } printConstant()
0qx6xfy63#
添加全局应用程序级别常量另一种有效方法是在适当的包中声明一个接口为
interface applicationConstants { //All constants goes here. static final float PI = 3.14 String ADMIN_USER = "ADMIN" Map languages = [ "en": "English", "hi": "Hindi", "mr": "Marathi" ] // Like above you can declare all application level code constants here. }
在任何类中使用常量,如下所示
import packageNameContainingInterface.applicationConstants // import statement. def adminUser = applicationConstants.ADMIN_USER println adminUser
mzaanser4#
我个人不会这样做,但从技术上讲,你可以这样做
Object.metaclass.MYCONSTANT = 'foobar'
那么每个物体都有它
4条答案
按热度按时间6rqinv9w1#
Groovy并没有真正的全球范围。当您有一个没有声明类的groovy脚本时,它会隐式地停留在一个带有脚本名称的类中。因此,顶级作用域中的最终变量实际上只是隐式类的字段。例如:
或多或少相当于:
很容易理解为什么它不起作用,扩展。一个简单的解决办法是在一个名为Constants的伪类中声明您的“全局变量”,然后对其执行静态导入。它甚至可以在一个脚本中完成所有工作。示例:
此外,脚本也是一种特殊情况。如果声明一个没有
def
或任何修饰符(如final
)的变量(即只使用它),它将进入脚本范围的绑定。因此,在这种情况下:CONSTANT
在脚本范围绑定中,但在:CONSTANT
是脚本的run()
方法中的局部变量。有关这方面的更多信息,请参见Groovy - Scoping and the Semantics of "def"页面的存档链接。jtw3ybtb2#
在Groovy 1.8+中,您可以使用
@Field
annotation:0qx6xfy63#
添加全局应用程序级别常量另一种有效方法是在适当的包中声明一个接口为
在任何类中使用常量,如下所示
mzaanser4#
我个人不会这样做,但从技术上讲,你可以这样做
Object.metaclass.MYCONSTANT = 'foobar'
那么每个物体都有它