Возвращение немодифицируемой карты
Используя Collections.unmodifiableMap(...)
, я пытаюсь вернуть немодифицируемый вид карты. Скажем, у меня есть следующий метод:
public final Map<Foo, Bar> getMap(){
...
return Collections.unmodifiableMap(map);
}
Почему в любом другом случае можно сделать следующее:
Map<Foo, Bar> map = getMap();
map.put(...);
Это не вызывает UnsupportedOperationException
, как я думал. Может кто-нибудь объяснить это или предложить, как я могу успешно вернуть действительно немодифицируемую карту?
Ответы
Ответ 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.