2014-07-10 66 views
2

問題

爲什麼靜態屬性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在一開始就只設置一次上課時第一次訪問。

我想這是正確的行爲。誰能證實這個假設?

另外:你能告訴我一個代碼示例它是如何正確完成的嗎?這是應該如何正確完成的:通過實施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分配已經解決,是一種「水漲船高」,從而改變PATH1PATH2沒有效果了嗎?

問題總結

  1. 是假設是否正確?
  2. 實現它的正確方法是什麼?

回答

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

(我用最後的,因爲它沒有任何意義,以保持可變性超越的GString了)

+0

請問你說的「新計算每次你問它的價值,」只有屬於帶有'getPATH2()'的第一個代碼示例,而不是'GString PATH2'的第二個代碼示例?當我拿出我的代碼示例,並且只將'String PATH2'改爲'GString PATH2'時,控制檯輸出保持不變,即每次詢問其值時都不會重新評估'GString PATH2'。正確? – Lernkurve

0

因爲它是在創建時解決的,以後不會更新。這不起作用的方式,每次你要求PATH2一次又一次計算。所以你的假設是正確的。

如何實現它?多次給靜態字段賦值看起來很臭。你應該使用普通(非靜態)字段與setter和getters。對於PATH2,只有吸氣劑是必需的。

相關問題