2010-05-22 9 views
20

Mentre studia il Collection API, troviamo che alcuni metodi (add, remove, ...) possono lanciare una java.lang.UnsupportedOperationException se l'attuale implementazione della collezione non supporta queste funzionalità.UnsupportedOperationException sulla collezione

Esiste davvero, nel JDK, un Collection concreto che non supporta questi metodi?

Grazie mille per le vostre risposte.

+0

può essere utile: 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 –

risposta

17

Gli esempi ovvi sono le implementazioni restituite da, ad esempio, Collections.unmodifiableCollection() e altri metodi simili. I metodi che modificano il Collection generano questa eccezione.

+0

Ok. Sembra essere una logica. Grazie. E per quanto riguarda le attuali (modificabili) implementazioni del JDK? Suppongo che tutte queste classi non facciano questa eccezione? –

+0

Fantastico esempio !! – ufdeveloper

4

Sì. Ad esempio, quando si chiama Collections.unmodifiableList(list), l'elenco restituito non supporta add(..)

Queste raccolte, tuttavia, sono principalmente classi private che non sono esposte a un'API, quindi non è possibile istanziarle.

+0

Grazie Bozho, anche per questa risposta ;-) –

22

Oltre alle collezioni restituiti dai Collections.unmodifiable* metodi, ci sono un altro paio di casi interessanti in cui UnsupportedOperationException è in realtà gettato:

  • il punto di vista di raccolta di un Map, accessibile tramite entrySet(), keySet() e values() può avere elementi rimossi ma non aggiunti,
  • la vista elenco restituita da Arrays.asList può avere elementi né aggiunti né rimossi,
  • inoltre, gli oggetti ottenuti dalI metodie Collections.singleton* sono anche contrassegnati come "immutable", quindi - sebbene non sia specificato esplicitamente nei documenti API - suppongo che questi generino l'eccezione anche nei tentativi di modificarli.
14

Normalmente quando si crea un elenco come List<String> sample=Collections.emptyList();. L'elenco sample verrà creato come Collections.unmodifiableCollection().

  • Quindi l'esempio di elenco non supporta le operazioni di elenco dinamico. È possibile solo assegnare un altro elenco a questo elenco utilizzando l'operatore di assegnazione. Ad esempio>

    List<String> ls=new ArrayList<String>(); 
    ls.add("one"); 
    ls.add("Three"); 
    ls.add("two"); 
    ls.add("four"); 
    sample = ls; 
    
  • Per le operazioni di elenco dinamico si dovrebbe avere una sintassi simile List<String> sample= new ArrayList<String>();. In questo elenco è possibile eseguire sample.add(), sample.addAll() ecc ...

Problemi correlati