sort ordenar example ejemplo collection characteristics java collections map unmodifiable

ordenar - java collections characteristics



Devolviendo un mapa no modificable (3)

Al usar Collections.unmodifiableMap(...) , estoy intentando devolver una vista no modificable de un mapa. Digamos que tengo el siguiente método,

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

¿Por qué es legal en otra parte hacer lo siguiente,

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

Esto no arroja una UnsupportedOperationException no UnsupportedOperationException como pensé que lo haría. ¿Alguien puede explicar esto o sugerir cómo puedo devolver con éxito un mapa realmente no modificable?


¿Estás seguro de que no estás ocultando tus excepciones de alguna manera? Esto funciona absolutamente bien, ya que lanza 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); } }

Le sugiero que imprima map.getClass() en el valor de retorno del método; esperaría que fuera un UnmodifiableMap .


Creé un pequeño programa de prueba y mi programa arrojó una "excepción de operación no admitida" cuando intenté ingresar datos.

código:

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"); } }

¿Qué más estás haciendo en tu clase?


Debe haber algo más mal. No hay forma de que puedas put algo en ese mapa después de envolverlo como un mapa no modificable.

Yo también sugeriría volver

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

de lo contrario, obtendrá advertencias "sin marcar" al compilar su código con -Xlint: sin marcar.