2010-05-22 24 views
20

Mientras que el estudio de la API Collection, encontramos que algunos métodos (add, remove, ...) pueden lanzar una java.lang.UnsupportedOperationException si la aplicación actual de la colección no soporta esas funcionalidades.UnsupportedOperationException en la Colección

¿Existe, en realidad, en el JDK, un concreto Collection que no es compatible con esos métodos?

Muchas gracias por sus respuestas.

+0

pueden ser útiles: http://www.google.com/codesearch?hl=en&q=%22throw+new+UnsupportedOperationException%22+package:%22http : //hg.openjdk.java.net/jdk7/l10n/jdk%22&filter=0p&sa=N&cd=7&ct=rm –

Respuesta

17

Los ejemplos obvios son las implementaciones devueltas de, por ejemplo, Collections.unmodifiableCollection() y otros métodos similares. Los métodos que cambiarían el Collection arrojan esta excepción.

+0

Ok. Parece ser lógica. Gracias. ¿Y las implementaciones actuales (modificables) del JDK? ¿Supongo que todas esas clases no arrojan esta excepción? –

+0

Ejemplo impresionante !! – ufdeveloper

4

Sí. Por ejemplo, cuando se llama a Collections.unmodifiableList(list), la lista devuelta no soporta add(..)

Estas colecciones, sin embargo, son clases mayoría privadas que no estén expuestos una una API, por lo que no se puede crear una instancia de ellos.

+0

Gracias Bozho, por esta respuesta también ;-) –

22

Aparte de las colecciones devueltos por los métodos Collections.unmodifiable*, hay un par más de casos interesantes en UnsupportedOperationException es en realidad lanzados:

  • los puntos de vista de recolección de un Map, se accede a través entrySet(), keySet() y values() puede tener elementos eliminados, pero no agregado,
  • la vista de lista devuelta por Arrays.asList puede tener elementos ni agregan ni eliminarse,
  • por otra parte, los objetos obtenidos a partir de laLos métodosy Collections.singleton* también están marcados como "inmutables", por lo tanto, aunque no se establece explícitamente en los documentos de la API, supongo que estos arrojan la excepción también en los intentos de modificarlos.
14

Normalmente cuando crea una lista como List<String> sample=Collections.emptyList();. La lista sample se creará como Collections.unmodifiableCollection().

  • Por lo tanto, el ejemplo de la lista no es compatible con las operaciones de la lista dinámica. Solo puede asignar otra lista a esta lista mediante el operador de asignación. Por ejemplo,>

    List<String> ls=new ArrayList<String>(); 
    ls.add("one"); 
    ls.add("Three"); 
    ls.add("two"); 
    ls.add("four"); 
    sample = ls; 
    
  • Para las operaciones de lista dinámica que debe tener una sintaxis como List<String> sample= new ArrayList<String>();. En esta lista se puede realizar sample.add(), sample.addAll() etc ...

Cuestiones relacionadas