2012-09-11 40 views
4

我想補充副本屬性映射到我的屬性映射的加*項*副本從Java地圖<字符串,對象>屬性映射

public void addProperties(Map<String, Object> propertyMap) { 
    for (Map.Entry<String, Object> propertyEntry : propertyMap.entrySet()) { 
     this.propertyMap.put(propertyEntry.getKey(), propertyEntry.getValue()); 
    } 
    } 

上面的代碼沒有做到這一點,但希望傳達意圖?

這樣做的最好方法是什麼?我已經對「克隆」,「防禦性複製」,「不可變對象」,Collections.unmodifiable等等進行了一些閱讀,但我比以前更加困惑。

所有我需要的,在典型的SO風格,是一個更好的方式來寫我的意思代碼片段,請。

+0

請問爲什麼要複製這個?它可以幫助我們爲你縮小答案。 – BlackVegetable

回答

3

看起來你可以只使用putAll

public void addProperties(Map<String, Object> propertyMap) { 
    this.propertyMap.putAll(propertyMap); 
} 

這就是所謂的 「防禦性複製」。這裏發生的是將本地propertyMap中的值複製到實例的propertyMap中。這裏的一個弱點是給定propertyMap的更改不會反映在實例的propertyMap中。這本質上是創建給定映射的快照並將該快照複製到實例字段映射。

還有其他創建防禦副本的方法,包括clone()HashMap(Map)構造函數。

對於不可變集合,Collections中的不可修改方法將返回在嘗試添加它們時會拋出異常的集合。例如,

Set<String> strs = Collections.unmodifiableSet(new HashSet<String>()); 
strs.add("Error"); // This line throws an exception 

不可變集合通過不允許修飾(刪除和添加)而防守副本通過不引用複製的集合(換言之保護它們的值保護它們的值,原始集合中的變化沒有在示出副本)。

+2

這不是和OP自己的片段完全一樣嗎?我不明白OP想要什麼,但由於(他)已經拒絕他/她自己的片段,因爲他沒有做他想做的事情,我猜這個也不行。 – ruakh

+0

我同意魯哈。 – kosa

+0

OP嘗試添加地圖中所有內容的副本(克隆)。 –

1

我認爲對於每個密鑰,您不必擔心複製,因爲它們是不可變的。但對於這些值取決於它們是什麼類型的對象。如果他們是可變對象,那麼你必須複製所有這些對象。

public void addProperties(Map<String, Object> propertyMap) { 
    Cloner cloner = new Cloner(); 
    for (Map.Entry<String, Object> propertyEntry : propertyMap.entrySet()) { 
     this.propertyMap.put(propertyEntry.getKey(), cloner.deepClone(propertyEntry.getValue())); 
    } 
} 

您可以檢查深層克隆Deep clone utility recomendation

從主頁http://code.google.com/p/cloning/

重要:Java類的深克隆可能意味着成千上萬個對象的克隆!克隆文件和流也可能導致JVM崩潰。強烈建議在開發過程中將克隆類轉儲到標準輸出,以便查看克隆的內容。

因此,很高興知道你想克隆什麼。

相關問題