Это синтаксический сахар для базовых сценариев. Пропуск ключевого слова «def» помещает переменную в привязки для текущего скрипта, а groovy рассматривает ее (в основном) как глобально переменную области видимости:
x = 1
assert x == 1
assert this.binding.getVariable("x") == 1
Использование ключевого слова def вместо этого не помещает переменную в привязки скриптов:
def y = 2
assert y == 2
try {
this.binding.getVariable("y")
} catch (groovy.lang.MissingPropertyException e) {
println "error caught"
}
Печать: «ошибка обнаружена»
Использование ключевого слова def в больших программах важно, поскольку оно помогает определить область, в которой можно найти переменную, и может помочь сохранить инкапсуляцию.
Если вы определите метод в своем скрипте, у него не будет доступа к переменным, созданным с помощью «def» в теле основного скрипта, поскольку они не находятся в области видимости:
x = 1
def y = 2
public bar() {
assert x == 1
try {
assert y == 2
} catch (groovy.lang.MissingPropertyException e) {
println "error caught"
}
}
bar()
печатает "ошибка обнаружена"
Переменная "y" не находится в области видимости внутри функции. «x» находится в области видимости, так как groovy проверит привязки текущего скрипта для переменной. Как я уже говорил ранее, это просто синтаксический сахар, позволяющий быстрее и быстрее набирать быстрые и грязные сценарии (часто один вкладыш).
Хорошая практика в больших сценариях - всегда использовать ключевое слово «def», чтобы вы не сталкивались со странными проблемами с областями видимости и не вмешивались в переменные, которые вам не нужны.
new FileInputStream('Test.groovy').getChannel()
без импорта?