2011-08-15 18 views
17

Utilizando Collections.unmodifiableMap(...), intento devolver una vista no modificable de un mapa. Digamos que tengo el siguiente método,Devolución de un mapa no modificable

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

¿Por qué es legal en otro lugar a hacer lo siguiente,

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

Esto no produce una UnsupportedOperationException como pensé que lo haría. ¿Puede alguien explicar esto o sugerir cómo puedo devolver un mapa realmente no modificable?

+0

¿Se puede publicar más código? Es difícil de creer ... – toto2

Respuesta

31

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

sugiero que imprima map.getClass() en el valor de retorno del método - Me esperaba que es una UnmodifiableMap.

+7

@Jon, no sabía que 'UnsupportedOperationException' era un error en tiempo de ejecución. Supuse que era un error en tiempo de compilación. Esto es mi culpa, pero tu respuesta me ayudó a darme cuenta de cuán tonta era realmente esta pregunta. ¡Gracias! – mre

4

he creado un pequeño programa de prueba y mi programa lanzó un 'UnsupportedOperationException' cuando traté de poner los datos en

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 haces en tu clase?

2

Debe haber algo más. No hay forma de que pueda put algo en ese mapa después de que lo haya envuelto como un mapa no modificable.

También sugeriría volver

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

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

Cuestiones relacionadas