É um açúcar sintático para scripts básicos. Omitir a palavra-chave "def" coloca a variável nas ligações do script atual e o groovy a trata (principalmente) como uma variável com escopo global:
x = 1
assert x == 1
assert this.binding.getVariable("x") == 1
O uso da palavra-chave def não coloca a variável nas ligações dos scripts:
def y = 2
assert y == 2
try {
this.binding.getVariable("y")
} catch (groovy.lang.MissingPropertyException e) {
println "error caught"
}
Impressões: "erro detectado"
O uso da palavra-chave def em programas maiores é importante, pois ajuda a definir o escopo no qual a variável pode ser encontrada e a preservar o encapsulamento.
Se você definir um método no seu script, ele não terá acesso às variáveis criadas com "def" no corpo do script principal, pois elas não estão no escopo:
x = 1
def y = 2
public bar() {
assert x == 1
try {
assert y == 2
} catch (groovy.lang.MissingPropertyException e) {
println "error caught"
}
}
bar()
imprime "erro detectado"
A variável "y" não está no escopo dentro da função. "x" está no escopo, já que o groovy verifica as ligações do script atual para a variável. Como eu disse anteriormente, isso é simplesmente açúcar sintático para tornar scripts rápidos e sujos mais rápidos de digitar (geralmente um forro).
A boa prática em scripts maiores é sempre usar a palavra-chave "def" para que você não tenha problemas de escopo estranhos ou interfira nas variáveis que não pretende.
new FileInputStream('Test.groovy').getChannel()
não importar?