2009-10-08 6 views
8

Fui a través de la documentación (http://java.sun.com/javase/6/docs/api/java/util/Iterator.html) de Iterator.remove() hay remove() fue descrito como¿Por qué iterator.remove() se ha descrito como operación opcional?

void remove() 

Quita de la colección subyacente el último elemento devuelto por el iterador (operación opcional). Este método solo se puede llamar una vez por llamada al siguiente. El comportamiento de un iterador no se especifica si la colección subyacente se modifica mientras la iteración está en progreso en de otra manera que llamando a este método .

  1. Así que nadie puede decir lo que significa "opcionales".
  2. ¿Afecta esto la robustez de la operación? (Como C++, no garantiza la solidez de las operaciones.)
  3. Por qué aquí se ha especificado categóricamente "opcional".
  4. ¿Qué significa "modificación" significa en la segunda línea de la documentación

comportamiento de un iterador no se especifica si se modifica la colección subyacente

Respuesta

13

# 1: Opcional significa que usted puede ponerlo en práctica o lanzar UnsupportedOperationException

# 2: Esta operación es opcional porque a veces simplemente no desea el argumento de su iterador t para ser modificado. ¿O qué entiende por "robustez de operación"?

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

Normalmente, se utiliza un iterador mediante la ejecución de

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(); 
    ... 
} 

Si ahora se quiere eliminar un elemento mientras que la iteración a través de la lista, y que le llamar

c.remove("Item 2"); 

esto es no limpio, posiblemente corrompe los datos en su Lista/Colección/... y debería ser evitado. En su lugar, eliminar() el elemento a través del repetidor:

i.remove(); 
+0

@Atmocreation: gracias por la explicación, ¿puede describir la pregunta 4? –

+0

explicación adicional sobre la eliminación, sigue leyendo de ** EDITAR ** # 4 – Atmocreations

+0

@Atmocreation: Gracias por la explicación ... vale la pena ... –

2

Se describe como opcional, ya que las clases no toda la colección que le puede dar un iterador implementan el método remove() del iterador regresan. Si el iterador devuelto no lo implementa, se lanzará un UnsupportedOperationException.

Las java.util.ArrayList, java.util.LinkedList normales y otras clases de recopilación estándar implementan el método remove() en sus iteradores, por lo que puede usarlo de forma segura.

+0

Así que la pregunta es realmente: ¿por qué está en la interfaz en primer lugar? – reinierpost

+0

@reinierpost Supongo que es conveniente porque muchas implementaciones implementarán este método. Cuando se diseña un software, siempre se deben realizar ciertas concesiones, por ejemplo, entre la "corrección" teórica y la utilidad práctica, un diseño complejo nunca es "perfecto". – Jesper

6

En primer lugar, java.util.Iterator es una interfaz, es decir, un acuerdo sobre cómo las clases que implementan esta interfaz interactúan con el resto del mundo. Es su responsabilidad cómo implementarán los métodos interafaciales.

Si la estructura de datos subyacente no permite la eliminación, entonces remove() lanzará un UnsupportedOperationException. Por ejemplo, si está iterando a través de un conjunto de resultados recuperado de un DB, tiene sentido no implementar este método.

Si itera sobre una colección que se comparte entre subprocesos simultáneos y el otro subproceso modifica el subproceso de iteración de datos, se obtendrán resultados no determinísticos.

+0

pero el hecho es que cada método de implementación permite la eliminación? –

+0

@Boris: gracias por la explicación. ¿Puedes describir la pregunta 4? –

Cuestiones relacionadas