web-dev-qa-db-ja.com

変更できないマップを返す

Collections.unmodifiableMap(...) を使用して、マップの変更不可能なビューを返そうとしています。次の方法があるとしましょう。

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

他の場所で次のことを行うことが合法であるのはなぜですか、

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

これは、私が思っていたように UnsupportedOperationException をスローしません。誰かがこれを説明したり、本当に変更できないマップを正常に返す方法を提案したりできますか?

18
mre

どういうわけかあなたの例外を隠していないのですか?これは、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()を出力することをお勧めします-私はexpectそれはUnmodifiableMapになります。

32
Jon Skeet

小さなテストプログラムを作成しましたが、データを入力しようとすると、プログラムが「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");
    }
}

クラスで他に何をしていますか?

4
Hunter McMillen

他に何か問題があるに違いありません。変更不可能なマップとしてラップした後、そのマップで何かをputできる方法はありません。

私も戻ることをお勧めします

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

そうしないと、-Xlint:uncheckedを使用してコードをコンパイルするときに、「チェックされていない」警告が表示されます。

3
emboss