2009-10-08 6 views
8

sono andato attraverso la documentazione (http://java.sun.com/javase/6/docs/api/java/util/Iterator.html) di Iterator.remove() ci remove() è stato descritto comeperché iterator.remove() è stato descritto come operazione opzionale?

void remove() 

Rimuove dalla collezione sottostante l'ultimo elemento restituito dal iteratore (operazione facoltativa). Questo metodo può essere chiamato solo una volta per chiamata a successiva. Il comportamento di un iteratore non è specificato se la raccolta sottostante viene modificata mentre l'iterazione è in corso in in un modo diverso dal chiamare questo metodo .

  1. Quindi nessuno può dire cosa significa "facoltativi".
  2. Questo influisce sulla robustezza dell'operazione? (Come C++, non garantisce la robustezza delle operazioni.)
  3. Perché "opzionale" è stato specificato categoricamente qui.
  4. Che cosa significa "modifica" significa nella seconda riga della documentazione

comportamento di un iteratore non è specificato se la raccolta sottostante viene modificato

risposta

13

# 1: Opzionale significa che è possibile attuarla o o un UnsupportedOperationException

# 2: Questa operazione è facoltativa perché a volte semplicemente non si desidera che il proprio iteratore contenga t da modificare. O cosa intendi per "robustezza operativa"?

EDIT # 4: behavior of an iterator is unspecified if the underlying collection is modified

Normalmente, si utilizza un iteratore eseguendo

List<String> c = new ArrayList<String>(); 
c.add("Item 1"); 
c.add("Item 2"); 
c.add("Item 3"); 
... 
for (Iterator<String> i = c.iterator(); i.hasNext();) 
{ 
    String s = i.next(); 
    ... 
} 

Se ora si vorrebbe rimuovere un elemento mentre l'iterazione attraverso la lista, e si sarebbe chiama

c.remove("Item 2"); 

questo è non pulito, possibilmente danneggia i dati nella tua lista/collezione/... e dovrebbe essere evitato. Invece, remove() la voce attraverso l'iteratore:

i.remove(); 
+0

@Atmocreation: grazie per la spiegazione, puoi descrivere la 4 domanda? –

+0

aggiunta spiegazione sulla rimozione, continua da ** EDIT ** # 4 – Atmocreations

+0

@Atmocreation: Grazie per la spiegazione ... vale la pena .. –

2

Viene descritto come optional perché le classi non tutta la linea che si può dare un iteratore implementano il metodo remove() nel iteratore tornano. Se l'iteratore restituito non lo implementa, verrà generato un UnsupportedOperationException.

Il normale java.util.ArrayList, java.util.LinkedList e altre classi di raccolta standard implementano tutti il ​​metodo remove() nei loro iteratori, quindi è possibile utilizzarlo in modo sicuro.

+0

Quindi la domanda è davvero: perché è nell'interfaccia in primo luogo? – reinierpost

+0

@reinierpost Immagino per comodità perché molte implementazioni implementeranno questo metodo. Quando si progetta il software ci sono sempre alcuni compromessi da effettuare, ad esempio tra "correttezza" teorica e utilità pratica, un progetto complesso non è mai "perfetto". – Jesper

6

Prima di tutto java.util.Iterator è un'interfaccia, ovvero un accordo su come le classi che implementano questa interfaccia si interrompono con il resto del mondo. È loro responsabilità come implementeranno i metodi di interaface.

Se la struttura dati sottostante non consente la rimozione, remove() genererà un valore UnsupportedOperationException. Ad esempio, se si sta iterando attraverso un set di risultati recuperato da un DB, ha senso non implementare questo metodo.

Se si esegue l'iterazione su una raccolta condivisa tra thread simultanei e l'altro thread modifica il thread di iterazione dei dati, restituirà risultati non deterministici.

+0

ma il fatto è che ogni metodo di implementazione consente la rimozione? –

+0

@ Boris: grazie per la spiegazione. Puoi descrivere la 4 domanda? –

Problemi correlati