Les constantes globales dans Groovy

il est souvent souhaitable de déclarer des constantes en haut d'un script qui peuvent être référencées n'importe où ailleurs dans le script. Dans Groovy, il semble que si vous déclarez une constante en utilisant final alors il n'est pas accessible dans les portées d'enfant. Quelle est la solution pour cette exigence très fondamentale et commune? La solution que j'ai maintenant est de créer une variable non liée, mais ce n'est pas une constante et n'est pas élégant.

41
demandé sur justGroovy 2011-02-01 06:45:14

3 réponses

Groovy n'a pas vraiment une portée globale. Quand vous avez un script groovy qui ne déclare pas une classe, il est implicitement coincé dans une classe avec le nom du script. Donc les variables finales au niveau supérieur sont en fait juste des champs de la classe implicite. Par exemple:

// foo.groovy
final MYCONSTANT = "foobar"
println MYCONSTANT

class Helper {
    def hello() { println MYCONSTANT }  // won't work
}
new Helper().hello()

Est plus ou moins équivalent à:

class foo {
    def run() {
        final MYCONSTANT = "foobar"
        println MYCONSTANT
        new Helper().hello()
    }
    static main(args) {
        new foo().run()
    }
}

class Helper {
    def hello() { println MYCONSTANT }  // won't work
}

il est facile de voir pourquoi cela ne fonctionne pas étendu. Un travail facile consiste à déclarer vos "globals" dans une classe fictive appelée par exemple Constantes, et puis faire une importation statique sur elle. Il fonctionne même dans un seul script. Exemple:

import static Constants.*

class Constants {
    static final MYCONSTANT = "foobar"
}

println MYCONSTANT

class Helper {
    def hello() { println MYCONSTANT } // works!
}
new Helper().hello()

EDIT:

en outre, les scripts sont un peu un cas spécial. Si vous déclarez une variable sans def ou tout modificateur tel que final, (c'est à dire juste l'utiliser), il va dans un script à l'échelle de la liaison. Donc dans ce cas:

CONSTANT = "foobar"
println "foobar"

constante est dans la reliure de script-wide, mais dans:

final CONSTANT = "foobar"
println "foobar"

constante est une variable locale dans le script run() méthode. Vous trouverez plus d'informations à ce sujet à l'adresse suivante:https://web-beta.archive.org/web/20150108090004/http://groovy.codehaus.org/Scoping+and+the+Semantics+of+%22def%22

68
répondu ataylor 2017-04-04 09:38:15

dans Groovy 1.8+, Vous pouvez réaliser ceci en utilisant le @Field annotation:

import groovy.transform.Field

@Field final String MY_CONSTANT = 'constant'

def printConstant() { println MY_CONSTANT }

printConstant()
19
répondu bmaupin 2015-07-08 18:48:16

une autre façon efficace d'ajouter les constantes du niveau global de l'application est déclarer un interface dans un emballage approprié comme

interface applicationConstants {
//All constants goes here.
    static final float PI = 3.14 
    String ADMIN_USER = "ADMIN"
    Map languages = [
        "en":   "English",
        "hi":   "Hindi",
        "mr":   "Marathi"

    ]
// Like above you can declare all application level code constants here.

}

utilisation de constantes dans n'importe quelle classe comme ci-dessous,

 import packageNameContainingInterface.applicationConstants // import statement.
 def adminUser = applicationConstants.ADMIN_USER
 println adminUser
0
répondu Nitin Dhomse 2017-12-12 13:23:43