从Java Map <String,Object> propertyMap添加*副本*条目

Rob*_*ino 5 java collections defensive-programming immutability

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

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

上面的代码没有这样做,但希望传达意图?

最好的方法是什么?我已经完成了一些关于"克隆","防御性复制","不可变对象",Collections.unmodifiable ......之类的阅读,但我比之前更加困惑.

我所需要的只是典型的SO风格,是一种更好的方式来表达我在代码片段中的意思.

Bri*_*ian 3

看起来你可以使用putAll

public void addProperties(Map<String, Object> propertyMap) {
    this.propertyMap.putAll(propertyMap);
}
Run Code Online (Sandbox Code Playgroud)

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

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

对于不可变集合,中的不可修改方法Collections将返回当您尝试添加时抛出异常的集合。例如,

Set<String> strs = Collections.unmodifiableSet(new HashSet<String>());
strs.add("Error"); // This line throws an exception
Run Code Online (Sandbox Code Playgroud)

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

  • 这不是和OP自己的代码片段做的事情完全一样吗?我不明白OP到底想要什么,但由于他已经拒绝了他/她自己的片段,因为他没有做他想做的事情,我想这个也行不通。 (2认同)