我想将 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
中。这实质上是创建给定 map 的快照,并将该快照复制到实例字段 map 。
还有其他创建防御副本的方法,包括 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/