[英]Adding *copies* of entries from Java Map<String, Object> propertyMap
我想將propertyMap的副本添加到我的propertyMap:
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風格,是一種更好的方式來表達我在代碼片段中的意思。
看起來你可以使用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
不可變集合通過禁止修改(刪除和添加)來保護其值,而防御副本通過不引用復制的集合來保護其值(換句話說,原始集合中的更改未顯示在副本中)。
我認為對於每個鍵,您不必擔心復制,因為它們是不可變的。 但對於值,它取決於它們是什么類型的對象。 如果它們是可變對象,那么你必須復制所有這些對象。
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()));
}
}
您可以檢查此深層克隆深度克隆實用程序推薦 。
從主頁http://code.google.com/p/cloning/
重要信息:深入克隆Java類可能意味着克隆了數千個對象! 克隆文件和流可能會導致JVM崩潰。 為了查看克隆的內容,強烈建議在開發期間將克隆類轉儲到stdout。
所以,知道你要克隆什么是很好的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.