C'est du sucre syntaxique pour les scripts de base. Omettre le mot-clé "def" place la variable dans les liaisons du script actuel et groovy la traite (principalement) comme une variable à portée globale:
x = 1
assert x == 1
assert this.binding.getVariable("x") == 1
L'utilisation du mot-clé def à la place ne place pas la variable dans les liaisons des scripts:
def y = 2
assert y == 2
try {
this.binding.getVariable("y")
} catch (groovy.lang.MissingPropertyException e) {
println "error caught"
}
Impressions: "erreur interceptée"
L'utilisation du mot-clé def dans des programmes plus volumineux est importante car elle permet de définir la portée dans laquelle la variable peut être trouvée et peut aider à préserver l'encapsulation.
Si vous définissez une méthode dans votre script, elle n'aura pas accès aux variables créées avec "def" dans le corps du script principal car elles ne sont pas dans la portée:
x = 1
def y = 2
public bar() {
assert x == 1
try {
assert y == 2
} catch (groovy.lang.MissingPropertyException e) {
println "error caught"
}
}
bar()
imprime "erreur interceptée"
La variable "y" n'est pas dans la portée de la fonction. "x" est dans la portée car groovy vérifiera les liaisons du script courant pour la variable. Comme je l'ai dit plus tôt, il s'agit simplement de sucre syntaxique pour rendre les scripts rapides et sales plus rapides à taper (souvent un liners).
La bonne pratique dans les scripts plus volumineux est de toujours utiliser le mot clé "def" afin de ne pas rencontrer d'étranges problèmes de portée ou d'interférer avec des variables que vous n'avez pas l'intention de faire.
new FileInputStream('Test.groovy').getChannel()
pas importer?