我想将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/