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
(то есть просто используете ее), она входит в привязку всего сценария.Таким образом, в этом случае:
CONSTANT = "foobar"
println "foobar"
CONSTANT находится в привязке всего сценария, но в:
final CONSTANT = "foobar"
println "foobar"
CONSTANT является локальной переменной в методе run()
сценария.Дополнительную информацию об этом можно найти по адресу https://web -beta.archive.org / web / 20150108090004 / http://groovy.codehaus.org/Scoping+and+the+Semantics+of+%22def%22