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

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

上面的代码不会这样做,但是希望传达出意图吗?

最好的方法是什么?我已经对“克隆”,“防御性复制”,“不可变对象(immutable对象)”,Collections.unmodifiable ...等进行了一些阅读,但是我比以前更加困惑。

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

最佳答案

看来您可以只使用 putAll :

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

这称为“防御性复制”。这里发生的是将本地propertyMap中的值复制到实例的propertyMap中。这里的一个弱点是,给定propertyMap的更改不会反射(reflect)在实例的propertyMap中。这实质上是创建给定映射的快照并将该快照复制到实例字段映射。

还有其他创建防御性副本的方法,包括clone()HashMap(Map)构造函数。

对于不可变的集合,Collections中不可修改的方法将返回在您尝试向其添加异常时引发异常的集合。例如,
Set<String> strs = Collections.unmodifiableSet(new HashSet<String>());
strs.add("Error"); // This line throws an exception

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

关于java - 从Java Map <String,Object> propertyMap添加条目的*副本*,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12374625/

10-09 19:49