簡體   English   中英

從Java Map添加*副本*條目 <String, Object> 屬性映射

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM