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

标签 java collections immutability defensive-programming

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

相关文章:

java - 从 Thymeleaf 中的嵌套列表绑定(bind)表单

java - 使用PreparedStatement从数据库获取ArrayList

java - 列出特定文件夹中的用户权限 alfresco cmis java

layout - 获取 Vaadin 8 中布局中的组件集合

java - 如何按数字而不是按字母顺序对文件名集合进行排序?

java - 为什么 String 类是不可变的,即使它有一个名为 "hash"的非最终字段

scala - 是否可以写一个不可变的双向链表?

java - 验证电子邮件时出现 NullPointerException

c# - C# 中的不可变本地 'variables'

linq - IQueryable 有什么大不了的?