为什么更改A时静态属性B = $ {A}不再变化?

时间:2014-07-10 08:52:56

标签: groovy static

问题

为其他静态属性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;这是否正确?所以更改PATH1PATH2不再有影响吗?

问题摘要

  1. 假设是否正确?
  2. 实施它的正确方法是什么?

2 个答案:

答案 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。