Возвращение неизменяемой карты
С помощью 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.