È zucchero sintattico per gli script di base. L'omissione della parola chiave "def" inserisce la variabile nei collegamenti per lo script corrente e Groovy la tratta (principalmente) come una variabile con ambito globale:
x = 1
assert x == 1
assert this.binding.getVariable("x") == 1
L'uso della parola chiave def invece non inserisce la variabile nei collegamenti degli script:
def y = 2
assert y == 2
try {
this.binding.getVariable("y")
} catch (groovy.lang.MissingPropertyException e) {
println "error caught"
}
Stampe: "errore rilevato"
L'uso della parola chiave def in programmi più grandi è importante in quanto aiuta a definire l'ambito in cui è possibile trovare la variabile e può aiutare a preservare l'incapsulamento.
Se si definisce un metodo nel proprio script, non avrà accesso alle variabili create con "def" nel corpo dello script principale in quanto non rientrano nell'ambito:
x = 1
def y = 2
public bar() {
assert x == 1
try {
assert y == 2
} catch (groovy.lang.MissingPropertyException e) {
println "error caught"
}
}
bar()
stampa "errore rilevato"
La variabile "y" non rientra nell'ambito della funzione. "x" è nell'ambito poiché groovy controllerà i binding dello script corrente per la variabile. Come ho detto prima, questo è semplicemente zucchero sintattico per rendere più veloci la digitazione di script veloci e sporchi (spesso una riga).
La buona pratica negli script più grandi è quella di utilizzare sempre la parola chiave "def" in modo da non incorrere in strani problemi di ambito o interferire con le variabili che non si intende.
new FileInputStream('Test.groovy').getChannel()
escludere l'importazione?