如何冻结HashMap以防止进一步的更改?

时间:2013-06-11 19:02:54

标签: java data-structures

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

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

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

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

map.freeze();

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

4 个答案:

答案 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类型。