18

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

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

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

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

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

4

3 回答 3

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.

于 2011-08-15T15:11:38.640 回答
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");
    }
}

你在课堂上还做什么?

于 2011-08-15T15:15:20.563 回答
3

一定有其他问题。put将其包装为不可修改的地图后,您无法在该地图中添加任何内容。

我也建议返回

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

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

于 2011-08-15T15:17:49.080 回答