155 votes

Comment puis-je créer et accéder aux variables globales en Groovy?

Je dois stocker une valeur dans une variable dans une méthode et ensuite j'ai besoin d'utiliser cette valeur à partir de cette variable dans une autre méthode ou une fermeture. Comment puis-je partager cette valeur?

251voto

mrhaki Points 956

Dans un script Groovy, la portée peut être différente de ce à quoi on s'attend. Cela est dû au fait qu'un script Groovy est en soi une classe avec une méthode qui exécutera le code, mais tout cela se fait à l'exécution. Nous pouvons définir une variable pour être dans la portée du script en omettant la définition de type ou en Groovy 1.8 nous pouvons ajouter l'annotation @Field.

import groovy.transform.Field

var1 = 'var1'
@Field String var2 = 'var2'
def var3 = 'var3'

void printVars() {
    println var1
    println var2
    println var3 // Cela ne fonctionnera pas, car ce n'est pas dans la portée du script.
}

38 votes

Juste pour noter Field @requires une importation.. import groovy.transform.Field

0 votes

Drôle a essayé de modifier pour changer ensuite à que dans la première ligne, SO veut une édition de six caractères!

1 votes

Si vous essayez d'utiliser une variable globale à partir d'une définition de classe, cela devient un peu compliqué. La solution class Globals ci-dessous est une façon de contourner cela.

63voto

Gaurav khurana Points 1201
def i_am_not_global = 100 // Cela ne sera pas accessible à l'intérieur de la fonction

i_am_global = 200 // cela est global et sera même disponible à l'intérieur du

def func()
{
    log.info "Ma valeur est 200. Ici, vous voyez " + i_am_global
    i_am_global = 400
    //log.info "si vous me décommentez, vous obtiendrez une erreur. Étant donné que i_am_not_global ne peut pas être imprimé ici " + i_am_not_global 
}
def func2()
{
   log.info "Ma valeur a été changée à l'intérieur de la fonction à 400. La voici = " + i_am_global
}
func()
func2()

ici la variable i_am_global est une variable globale utilisée par func et ensuite à nouveau disponible pour func2

si vous déclarez une variable avec def elle sera locale, si vous n'utilisez pas def elle est globale

61voto

Bob Herrmann Points 1653
classe Globals {
   String statique ouch = "Je suis global.."
}

imprime Globals.ouch

5voto

Aaron Digulla Points 143830

Comme toutes les langues orientées objet, Groovy n'a pas de concept "global" en soi (contrairement, par exemple, au BASIC, à Python ou à Perl).

Si vous avez plusieurs méthodes qui ont besoin de partager la même variable, utilisez un champ :

class Foo {
    def a;

    def foo() {
        a = 1;
    }
    def bar() {
        print a;
    }
}

2voto

tim_yates Points 63521

Déclarez simplement la variable au niveau de la classe ou du script, puis accédez-y depuis vos méthodes ou vos fermetures. Sans exemple, il est difficile d'être plus spécifique pour votre problème particulier cependant.

Cependant, les variables globales sont généralement considérées comme une mauvaise pratique.

Pourquoi ne pas renvoyer la variable d'une fonction, puis la transmettre à la suivante ?

1 votes

Qu'en est-il si je veux utiliser la variable dont la valeur a été attribuée dans une fermeture? Par exemple: j'ai def a = null au début du script. Maintenant, à l'intérieur d'une fermeture, la valeur de a = 'some string', est attribuée. Je veux que cette nouvelle valeur soit accessible à toutes les autres fermetures. Merci.

0 votes

Vraiment? Tu te détesteras quand tu devras essayer de le réparer

0 votes

J'ai fini par créer une fermeture qui renvoie la valeur calculée souhaitée et l'utiliser là où elle est nécessaire

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X