2010-02-18 10 views

Respuesta

140

Sí, porque no es así como elimina un rango del código externo. En su lugar, hacer esto:

list.subList(start, end).clear(); 

Esta realidad llama removeRange detrás de las escenas.


El PO pregunta por qué removeRange no es parte de la API pública List. El motivo se describe en el elemento 40 de Effective Java 2nd ed, y lo cito aquí:

Existen tres técnicas para acortar las listas de parámetros excesivamente largas. Uno es dividir el método en múltiples métodos, cada uno de los cuales requiere solo un subconjunto de los parámetros. Si se hace sin cuidado, esto puede conducir a demasiados métodos, pero también puede ayudar a a reducir el recuento de métodos al aumentar la ortogonalidad. Por ejemplo, considere la interfaz java.util.List. No proporciona métodos para encontrar el primer o último índice de un elemento en una sublista, los cuales requerirían tres parámetros. En cambio, proporciona el método subList, que toma dos parámetros y devuelve una vista de una sublista. Este método se puede combinar con los métodos indexOf o lastIndexOf, cada uno de los cuales tiene un único parámetro, para proporcionar la funcionalidad deseada. Además, el método subList se puede combinar con cualquier método que opera en una instancia List para realizar cálculos arbitrarios en sublistas. La API resultante tiene una relación potencia-peso muy alta.

Se puede argumentar que removeRange no tiene esa cantidad de parámetros y por lo tanto es probable que no es un candidato para este tratamiento, pero teniendo en cuenta que hay una forma de invocar removeRange a través de la subList, no hay razón para el desorden de la List interfaz con un método redundante.


La documentación AbstractList.removeRange dice:

Este método es llamado por la operación clear en esta lista y sus sublistas. Anulando este método para aprovechar las funciones internas de la implementación de la lista puede sustancialmente mejorar el rendimiento de la operación clear en esta lista y sus sublistas.

Además, consulte la implementación de OpenJDK de AbstractList.clear y SubList.removeRange.

+6

Ok, se puede hacer de esa manera, pero * ¿por qué? Parece incómodo. Los elementos individuales se pueden eliminar de la lista directamente, ¿por qué no los elementos múltiples entonces? –

+1

@Joonas: artículo 40 de Java efectivo, 2da ed describe la razón de esto. Pegaré en la sección relevante en caso de que no tengas el libro. –

+1

¡Gracias, exactamente lo que estaba buscando! Ahora hace * algún * sentido :) –

Cuestiones relacionadas