Подтвердить что ты не робот

Возвращение немодифицируемой карты

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

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

Почему в любом другом случае можно сделать следующее:

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

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

4b9b3361

Ответ 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.

Ответ 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);

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