【问题标题】:Returning an unmodifiable map返回不可修改的地图
【发布时间】:2011-10-27 08:29:20
【问题描述】:

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

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

为什么在其他地方做以下事情是合法的,

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

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

【问题讨论】:

  • 你能发布更多代码吗?难以置信……

标签: java collections map unmodifiable


【解决方案1】:

你确定你没有以某种方式掩盖你的异常吗?这工作得很好,因为它会抛出 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

【讨论】:

  • @Jon,我不知道UnsupportedOperationException 是一个运行时错误。我曾认为这是一个编译时错误。这是我的错,但你的回答让我意识到这个问题真的很愚蠢。谢谢!
【解决方案2】:

我创建了一个小型测试程序,当我尝试将数据放入时,我的程序抛出了“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");
    }
}

你还在课堂上做什么?

【讨论】:

    【解决方案3】:

    肯定有其他问题。将其包装为不可修改的地图后,您无法在该地图中put 某些东西。

    我也建议返回

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-04
      • 2011-04-20
      • 2020-03-20
      • 2012-09-19
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 2013-01-31
      • 2010-11-02
      相关资源
      最近更新 更多