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