2012-06-02 43 views
1

這裏是我的常規文件的內容:Groovy的屬性斷言失敗

def KEY = "a" 

Properties myProp = new Properties() 
myProp[KEY] = "b" 
assert(myProp[KEY] == myProp.getProperty(KEY)) 

Properties results = new Properties(myProp) 
assert(results[KEY] == results.getProperty(KEY)) 

我預計這兩種主張通過,但只有第一個斷言的推移和第二斷言失敗。

對此的任何解釋都非常感謝。謝謝!

回答

1

所以,當文檔說「創建一個空的屬性列表」,這就是它的作用:

println(results) 
>>> [:] 

檢查什麼getProperty做:

搜索具有指定鍵的屬性在此屬性列表中。如果在此屬性列表中未找到該鍵,則會遞歸檢查默認屬性列表及其默認值。如果找不到該屬性,該方法返回null。

通往該[]getAt)不搜索默認屬性列表中的結論。

我們可以追求這個,看看農具getAt怎樣的Groovy:

public static <K,V> V getAt(Map<K,V> self, K key) { 
    return self.get(key); 
} 

所以它調用底層Hashtableget方法,該方法一無所知默認屬性列表 - 默認是Properties一部分,而不是Hashtable

println(results.getProperty(KEY)) 
>>> b 
println(results.getAt("a")) 
>>> null 
println(results.get("a")) 
>>> null 

這是「正確的」行爲嗎?可能不是 - 也許Properties.getAt將按順序。

+0

詳細解釋!謝謝。 – Bala

+0

@Bala沒問題;很有意思。實際上,我會考慮爲此提出增強請求。我認爲這違反了最不讓人驚訝的原則。如果你這樣做,請在這裏跟隨評論 - 如果我幾天內沒有看到任何東西,我可能會自己做,但國際海事組織,你應該得到發現它的功勞(如果它還沒有被要求,它對我來說似乎是一個明顯的問題)。 –

+0

@ D.Newton我擔心,在提出請求後,我可能沒有時間跟進Groovy開發人員。所以,如果你有興趣,請提交一份改進。謝謝! – Bala