gpt4 book ai didi

java - 从 Java Map propertyMap 添加条目的*副本*

转载 作者:搜寻专家 更新时间:2023-10-31 20:14:12 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com