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