返回不可修改的地图

时间:2011-08-15 15:08:11

标签: java collections map unmodifiable

使用Collections.unmodifiableMap(...),我试图返回地图的不可修改的视图。我们说我有以下方法,

public final Map<Foo, Bar> getMap(){
    ...
    return Collections.unmodifiableMap(map);
}

为什么在其他地方合法执行以下操作,

Map<Foo, Bar> map = getMap();
map.put(...);

这并不像我想的那样抛出UnsupportedOperationException。有人可以解释一下,或者建议我如何成功地返回真正无法修改的地图?

3 个答案:

答案 0 :(得分:32)

你确定你没有以某种方式屏蔽你的例外吗?这非常正常,因为它会抛出UnsupportedOperationException

import java.util.*;

public class Test {

    public static void main(String[] args) {
        Map<String, String> map = getMap();
        map.put("a", "b");
    }

    public static final Map<String, String> getMap(){
        Map<String, String> map = new HashMap<String, String>();
        map.put("x", "y");
        return Collections.unmodifiableMap(map);
    }
}

我建议您在方法的返回值上打印map.getClass() - 我希望期望UnmodifiableMap

答案 1 :(得分:4)

我创建了一个小型测试程序,当我尝试输入数据时,我的程序抛出了“UnsupportedOperationException”。

代码:

import java.util.*;

public class TestUnmodifiableMap
{
    Map<Integer, String> myMap;

    public TestUnmodifiableMap()
    {
        myMap = new HashMap<Integer, String>();
    }

    public final Map<Integer, String> getMap()
    {
        return Collections.unmodifiableMap(myMap);
    }

    public static void main(String[] args)
    {
        TestUnmodifiableMap t = new TestUnmodifiableMap();
        Map<Integer, String> testMap = t.getMap();

        testMap.put(new Integer("1"), "Hello");
    }
}

你班上还在做什么?

答案 2 :(得分:3)

一定有别的错误。在将其包装为不可修改的地图后,您无法在该地图中put使用某些内容。

我还建议你回来

return Collections.<Foo, Bar>unmodifiableMap(map);

否则,在使用-Xlint编译代码时,您将收到“未选中”警告:未选中。