Це синтаксичний цукор для основних сценаріїв. Якщо вимкнути ключове слово "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()
не імпортувати?