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"
    }