从Java Map添加条目的*副本*<;字符串,对象>;房地产地图

从Java Map添加条目的*副本*<;字符串,对象>;房地产地图,java,collections,immutability,defensive-programming,Java,Collections,Immutability,Defensive Programming,我想将propertyMap的副本添加到我的propertyMap中: public void addProperties(Map<String, Object> propertyMap) { for (Map.Entry<String, Object> propertyEntry : propertyMap.entrySet()) { this.propertyMap.put(propertyEntry.getKey(), propertyEnt

我想将propertyMap的副本添加到我的propertyMap中:

  public void addProperties(Map<String, Object> propertyMap) {
    for (Map.Entry<String, Object> propertyEntry : propertyMap.entrySet()) {
      this.propertyMap.put(propertyEntry.getKey(), propertyEntry.getValue());
    }
  }
public void addProperties(映射属性映射){
对于(Map.Entry propertyEntry:propertyMap.entrySet()){
this.propertyMap.put(propertyEntry.getKey(),propertyEntry.getValue());
}
}
上面的代码并没有做到这一点,但希望传达的意图

最好的方法是什么?我读过一些关于“克隆”、“防御性复制”、“不可变对象”、集合的书。不可修改。。。诸如此类,但我比以前更困惑了


在典型的SO风格中,我所需要的是一种更好的方式来编写我在代码段中的意思。

看起来您可以使用:


不可变集合通过禁止修改(删除和添加)来保护其值,而防御副本通过不引用复制的集合来保护其值(换句话说,原始集合中的更改不会显示在副本中).

我认为对于每个键,您不必担心复制,因为它们是不可变的。但对于值,这取决于对象的类型。如果它们是可变对象,则必须复制所有这些对象

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())); 
    } 
} 
public void addProperties(映射属性映射){
克隆人克隆人=新克隆人();
对于(Map.Entry propertyEntry:propertyMap.entrySet()){
this.propertyMap.put(propertyEntry.getKey(),cloner.deepClone(propertyEntry.getValue());
} 
} 
您可以检查此项是否有深clonning

从主页

重要提示:Java类的深度克隆可能意味着数千个对象被克隆!此外,文件和流的克隆可能会导致JVM崩溃。强烈建议在开发期间启用将克隆的类转储到标准输出,以便查看克隆的内容


因此,很高兴知道您要克隆的是什么。

请问您为什么要复制此文件?这可能有助于我们为您缩小答案的范围。这不是和OP自己的代码片段完全一样吗?我不知道OP到底想要什么,但因为他已经拒绝了他/她自己的代码片段,因为他/她没有做他想要的,我猜这也不会起作用。OP试图添加地图中所有内容的副本(克隆)。据我所知,他想要给定地图的防御性副本。如果这是他想要的(与给定地图支持的不可修改地图相反),那么这个答案是正确的。您可以(简要地)提供关于什么是防御副本以及为什么您的解决方案符合要求的信息吗?谢谢。这为我澄清了一切,我相信将来其他观众也会明白这一点+1.
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())); 
    } 
}