问题
为其他静态属性PATH2
分配新值后,为什么静态属性PATH1
没有变化?
请参阅以下示例中的assert
。
示例
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
假设
PATH2
似乎只在第一次访问类Configuration
时才设置一次。
我认为这是正确的行为。有人能证实这个假设吗?
另外:你能告诉我一个代码示例它是如何正确完成的吗?这是应该如何正确完成的:通过实施getPATH2()
方法?
class Configuration {
static public String PATH1 = "c:\\production"
static public String PATH2 = "${PATH1}\\subfolder"
static public getPATH2() {
return "${PATH1}\\subfolder"
}
}
在实例化类Configuration
之后,它在内存中的样子是否正确?
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"
}
}
PATH1
分配中的变量PATH2
占位符是否已经解决并且已经消失了#34;这是否正确?所以更改PATH1
对PATH2
不再有影响吗?
问题摘要
答案 0 :(得分:1)
一些评论......首先你的假设是正确的。其次,如果你使用吸气剂,我建议反对这个领域。这使得该属性成为只读属性,但无论如何,getter永远不会看到更改的值。
然后有一个替代的getter,它与一个字段一起使用,但是使用GString代替。 GString是惰性求值,每次询问它的值时都会重新评估。你实际上已经这样做了:
class Configuration {
static public String PATH1 = "c:\\production"
static public String PATH2 = "${PATH1}\\subfolder"
static public getPATH2() {
return "${PATH1}\\subfolder"
}
}
但是如果你将一个GString分配给一个String,就像你在PATH2中那样,你就会失去懒惰的方面。因此,更正后的版本将是:
class Configuration {
static public String PATH1 = "c:\\production"
static final public GString PATH2 = "${PATH1}\\subfolder"
}
(我使用final,因为将可变性保持在GString以外是没有意义的)
答案 1 :(得分:0)
因为它在创建时已解决,之后未更新。这不会影响您每次要求PATH2
时一次又一次地计算。所以你的假设是正确的。
如何实施?多次为静态字段赋值看起来很臭。您应该使用带有setter和getter的普通(非静态)字段。对于PATH2
,只需要getter。