这个问题几乎是不言自明的。我有一个数据结构(我提到了一个HashMap
,但也可能是一个Set或一个List),我最初填充:
Map<String, String> map = new HashMap<String, String>();
for( something ) {
map.put( something );
}
填充结构后,我绝不想添加或删除任何项目:
map.freeze();
如何使用标准Java库实现这一目标?
答案 0 :(得分:18)
使用标准JDK库可以做的最好的事情是Collections.unmodifiableMap()
。
请注意,必须删除原始地图引用,因为仍可以正常访问和更改该引用。如果您将旧引用传递给任何其他对象,它们仍然可以更改您的地图。
最佳实践:
map = Collections.unmodifiableMap(map);
并确保您没有分享原始map
引用。
答案 1 :(得分:7)
听起来你会对Guava的ImmutableMap
做得很好。这允许使用Builder模式来组装和“冻结”。
答案 2 :(得分:3)
将它包装在一个类中并使其不可变。例如:
public class ImmutableMapWrapper {
private Map<String, String> map = new HashMap<String, String>();
public ImmutableMapWrapper() {
for( something ) {
this.map.put( something );
}
}
}
答案 3 :(得分:0)
创建一个不可变的HashMap:
HashMap <MyKey, MyValue> unmodifiableMap = Collections.unmodifiableMap(modifiableMap);
JavaDoc here。
另外,我认为Google数据集合utils(Guava ???)已经有了一个ImmutableMap类型。