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风格,是一种更好的方式来表达我在代码片段中的意思.
看起来你可以使用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)
不可变集合通过禁止修改(删除和添加)来保护其值,而防御性副本通过不引用复制的集合来保护其值(换句话说,原始集合中的更改不会显示在副本中)。
| 归档时间: |
|
| 查看次数: |
490 次 |
| 最近记录: |