Groovy 为什么静态属性B=${A}在更改A时不再更改?
问题 为什么在为另一个静态属性Groovy 为什么静态属性B=${A}在更改A时不再更改?,groovy,static,Groovy,Static,问题 为什么在为另一个静态属性PATH1分配了新值后,静态属性PATH2没有更改 请参见下面示例中的断言 示例 println "--- Original values ---" println "Configuration.PATH1: ${Configuration.PATH1}" println "Configuration.PATH2: ${Configuration.PATH2}" println "" println "--- Values after changing PATH1
PATH1
分配了新值后,静态属性PATH2
没有更改
请参见下面示例中的断言
示例
println "--- Original values ---"
println "Configuration.PATH1: ${Configuration.PATH1}"
println "Configuration.PATH2: ${Configuration.PATH2}"
println ""
println "--- Values after changing PATH1---"
Configuration.PATH1 = "c:\\test"
println "Configuration.PATH1: ${Configuration.PATH1}"
println "Configuration.PATH2: ${Configuration.PATH2}"
println ""
assert Configuration.PATH2 == "c:\\test\\subfolder"
class Configuration {
static public String PATH1 = "c:\\production"
static public String PATH2 = "${PATH1}\\subfolder"
}
输出
--- Original values ---
Configuration.PATH1: c:\production
Configuration.PATH2: c:\production\subfolder
--- Values after changing PATH1 ---
Configuration.PATH1: c:\test
Configuration.PATH2: c:\production\subfolder // <-- Hasn't changed
Assertion failed:
assert Configuration.PATH2 == "c:\\test\\subfolder"
| |
| false
c:\production\subfolder
在类配置
被实例化之后,这就是它在内存中的样子,这是正确的吗
class Configuration {
static public String PATH1 = "c:\\production"
static public String PATH2 = "c:\\production\\subfolder" // Variable PATH1 has been resolved after class instantiation and is sort of "gone" so changing PATH1 has no effect on PATH2 anymore?
static public getPATH2() {
return "${PATH1}\\subfolder"
}
}
PATH2
赋值中的变量PATH1
占位符已被解析并且有点“消失”了,因此更改PATH1
对PATH2
没有任何影响,这是否正确
问题摘要
因为它是在创建时解析的,以后不会更新。这与每次请求
PATH2
时的计算方式不同。所以你的假设是正确的
如何实施?多次给静态字段赋值看起来很难闻。您应该将普通(非静态)字段与setter和getter一起使用。对于路径2,只需要getter。一些备注。。。首先,你的假设是正确的。第二,如果你使用getter,我建议你不要使用这个字段。这使属性成为只读属性,但getter无论如何都不会看到更改的值 还有一种替代getter的方法,即保留一个字段,但改用GString。GString是惰性计算的,每次您请求它的值时都会重新计算它。实际上,您已经在:
class Configuration {
static public String PATH1 = "c:\\production"
static public String PATH2 = "${PATH1}\\subfolder"
static public getPATH2() {
return "${PATH1}\\subfolder"
}
}
但是,如果像在PATH2中那样将GString分配给字符串,则会丢失惰性方面。因此,更正后的版本应为:
class Configuration {
static public String PATH1 = "c:\\production"
static final public GString PATH2 = "${PATH1}\\subfolder"
}
(我使用final,因为将易变性保留在GString之外是没有意义的)您的备注“每次请求它的值时都会进行新评估”是否只属于第一个代码示例中的getPATH2()
,而不是第二个代码示例中的GString PATH2
?以代码为例,仅将String PATH2
更改为GString PATH2
时,控制台输出保持不变,即,GString PATH2
不会在每次请求其值时得到新的求值。对的
class Configuration {
static public String PATH1 = "c:\\production"
static final public GString PATH2 = "${PATH1}\\subfolder"
}