Pregunta ¿Por qué AbstractCollection no implementa size ()?


Al subclasificar AbstractCollection, Aun debo implementar size(), aunque (creo) hay una razonable Implementación predeterminada correcta (aunque sin rendimiento):

public int size() {
    int count = 0;

    for (Iterator<E> i = iterator(); i.hasNext();) {
        i.next();
        count++
    }

    return count;
}

¿Por qué los diseñadores no incluyeron una implementación predeterminada de size()? ¿Intentaron forzar a los desarrolladores a pensar conscientemente sobre este método, con suerte haciendo que el desarrollador ofrezca una implementación que funciona mejor que la predeterminada?


5
2017-07-13 09:01


origen


Respuestas:


Sospecho que su última frase es la verdadera razón. Al subclasificar una clase abstracta, a veces es tentador anular los métodos abstractos. Esperaría casi cada implementación para tener una mejor implementación que simplemente iterar, así que si querer Casi todos deben anular un método, probablemente sea una buena idea no proporcionar una implementación básica (lenta). Simplemente reduce las posibilidades de joder :)


11
2017-07-13 09:03



Si bien esto es un posible implementación predeterminada, no es necesariamente una buena (o incluso una sensata).

En casi todos propósito general Collection implementación hay una forma O (1) de averiguar el tamaño. Por lo general, simplemente mediante la consulta de un campo simple.

Esta debería ser la implementación. En los casos muy raros en los que este no es el caso, la implementación aún podría recaer en su código de ejemplo (o implementarlo de manera diferente).


5
2017-07-13 09:05



Apoyo su teoría: tal vez los implementadores simplemente estén obligados a implementar un bien (O(1) si es posible) implementación para size(), porque

  • el método se usa con bastante frecuencia
  • si programamos contra interfaces, no conocemos el tipo de colección real
  • Una implementación predeterminada (o incorrecta) puede matar el rendimiento inesperadamente

1
2017-07-13 09:07



Para algunos tipos de lista, su implementación predeterminada propuesta es dañina. Estoy pensando en listas perezosas o listas que dan como resultado una estructura de datos en memoria muy grande cuando se itera.

En el caso de la lista perezosa infinita, su implementación predeterminada propuesta es claramente incorrecta.


1
2017-07-13 09:30



En realidad, ya que tanto el add y remove las operaciones tienen un valor de retorno que indica si la operación dio como resultado un cambio en el tamaño de la colección, podría implementar un evento mejor size método al realizar un seguimiento de las adiciones y elimina en la mayoría de los casos.


0
2017-07-13 09:09