Возвращение неизменяемой карты - PullRequest
17 голосов
/ 15 августа 2011

Используя Collections.unmodifiableMap(...), я пытаюсь вернуть неизменяемый вид карты. Допустим, у меня есть следующий метод,

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

Почему в других местах разрешено делать следующее,

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

Это не бросает UnsupportedOperationException, как я и думал. Может кто-нибудь объяснить это, или предложить, как я могу успешно вернуть действительно неизменяемую карту?

Ответы [ 3 ]

32 голосов
/ 15 августа 2011

Вы уверены, что не скрываете свои исключения?Это работает абсолютно нормально, так как выдает 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.

4 голосов
/ 15 августа 2011

Я создал небольшую тестовую программу, и моя программа вызвала «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 голосов
/ 15 августа 2011

Должно быть что-то еще не так.Вы не сможете put что-то на этой карте после того, как вы обернули это как неизменяемую карту.

Я бы также предложил вернуть

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

, иначе вы получите "непроверенные" предупрежденияпри компиляции кода с -Xlint: не проверено.

...