繁体   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