Возвращение неизменяемой карты

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

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

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

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

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

3 ответа

Решение

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

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

Что еще ты делаешь в своем классе?

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

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

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

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

Другие вопросы по тегам