6

这个问题几乎是不言自明的。我最初填充了一个数据结构(我提到了一个HashMap,但它也可能是一个 Set 或一个 List):

Map<String, String> map = new HashMap<String, String>();

for( something ) {
  map.put( something );
}

填充结构后,我不想添加或删除任何项目:

map.freeze();

使用标准 Java 库如何实现这一点?

4

4 回答 4

19

您可以使用标准 JDK 库做的最好的事情是Collections.unmodifiableMap().

请注意,您必须删除原始地图参考,因为该参考仍然可以正常访问和更改。如果您将旧引用传递给任何其他对象,它们仍然可以更改您的地图。

最佳实践:

map = Collections.unmodifiableMap(map);

并确保您没有共享原始map参考。

于 2013-06-11T19:04:38.240 回答
7

听起来你会用 Guava 做得很好ImmutableMap。它允许使用 Builder 模式来组装和“冻结”。

于 2013-06-11T19:06:34.677 回答
3

将它包装在一个类中并使其不可变。例如:

public class ImmutableMapWrapper {

    private Map<String, String> map = new HashMap<String, String>();

    public ImmutableMapWrapper() {
        for( something ) {
            this.map.put( something );
        }
    }
}
于 2013-06-11T19:05:44.877 回答
0

创建一个不可变的 HashMap:

HashMap <MyKey, MyValue> unmodifiableMap = Collections.unmodifiableMap(modifiableMap); 

JavaDoc在这里

另外,我认为谷歌数据收集工具(番石榴???)已经有一个 ImmutableMap 类型。

于 2013-06-11T19:06:17.567 回答