Подтвердить что ты не робот

Глобальные константы в Groovy

Часто желательно объявить константы в верхней части script, на которые можно ссылаться где-нибудь еще в script. В Groovy кажется, что если вы объявляете константу с использованием final, тогда она недоступна в дочерних областях. Каково решение этого очень простого и общего требования? Обходной путь, который я имею сейчас, заключается в создании несвязанной переменной, но это не постоянное и не элегантное.

4b9b3361

Ответ 1

Groovy действительно не имеет глобальной области. Когда у вас есть groovy script, который не объявляет класс, он неявно застревает в классе с именем script. Таким образом, конечные переменные в области верхнего уровня - это действительно просто поля неявного класса. Например:

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

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

Более или менее эквивалентно:

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
}

Легко понять, почему он не работает. Легкая работа заключается в том, чтобы объявить ваши "глобалы" в фиктивном классе, например, например. Константы, а затем просто сделайте статический импорт на нем. Он даже работает в одном script. Пример:

import static Constants.*

class Constants {
    static final MYCONSTANT = "foobar"
}

println MYCONSTANT

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

ИЗМЕНИТЬ:

Кроме того, скрипты представляют собой бит особого случая. Если вы объявляете переменную без def или любых модификаторов, таких как final, (то есть просто используйте ее), она переходит в привязку script. Итак, в этом случае:

CONSTANT = "foobar"
println "foobar"

CONSTANT находится в script -общем привязке, но в:

final CONSTANT = "foobar"
println "foobar"

CONSTANT - это локальная переменная в методе script run(). Более подробную информацию об этом можно найти на https://web-beta.archive.org/web/20150108090004/http://groovy.codehaus.org/Scoping+and+the+Semantics+of+%22def%22

Ответ 2

В Groovy 1,8+ вы можете достичь этого, используя @Field аннотация:

import groovy.transform.Field

@Field final String MY_CONSTANT = 'constant'

def printConstant() { println MY_CONSTANT }

printConstant()

Ответ 3

Другим эффективным способом добавления глобальных констант уровня приложения является объявить один интерфейс в подходящем пакете как

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.

}

Использование констант в любом классе, как показано ниже,

 import packageNameContainingInterface.applicationConstants // import statement.
 def adminUser = applicationConstants.ADMIN_USER
 println adminUser