2011-02-06 20 views
7

LinkedList tiene descripciones similares para el método element() y el método getFirst() (curiosamente, no son las mismas palabras).¿Cuál es la diferencia entre los métodos element() y getFirst() en la clase LinkedList?

Deque indica claramente que los dos métodos son los mismos en términos del valor de retorno y la excepción.

Mi pregunta es: ¿por qué tener 2 métodos idénticos? ¿Es por compatibilidad con versiones anteriores? ¿Es un enfoque más eficiente que el otro?

Respuesta

5

element() se hereda de Queue donde tiene sentido tener sólo uno método para acceder ya que todo lo puede hacer en una cola es quitar el primer elemento. Sin embargo, una deque admite esto desde ambos extremos, necesitando métodos explícitos para hacerlo.

Y no es muy agradable diseñar una API donde accedería al primer elemento con element() y el último con getLast().

Otra cosa que podría desempeñar en esto es que Deque se añadió en la versión 1.6, donde las partes de las partes antiguas de Java Collections Framework se han quedado obsoletos por las convenciones más recientes, como explícitos get~/set~ métodos de acceso a la propiedad. En ese contexto, getFirst() y getLast se adhieren más fielmente a las convenciones actuales de Java.

+0

En realidad, la convención get/set no es realmente nueva, en realidad es más antigua que el marco de recopilación (compare la antigua clase vectorial con la nueva interfaz List, por ejemplo). –

+0

Honestamente creo que en ese caso, el método element() debería haberse eliminado. Suponiendo que no va a ser apreciado por mucha gente, ¿no podría haber sido desaprobado al menos? O al menos, algún tipo de guía en los Javadocs en cuanto a qué método elegir entre los dos. (Estoy bastante seguro de que este no es el único ejemplo de métodos duplicados en Java). – user183037

+0

@ Paŭlo: Supongo que ya no les importa, especialmente con las colecciones. Si bien se desaprobaron como el 99% de Swing y lo volvieron más engorroso, las colecciones retienen métodos como 'size()': | – Joey

0

En un enlace de la lista, parece que son iguales. Pero en una cola, element() parece ser un método para alcanzar el primer elemento en la cola, pero no eliminarlo de la cola.

3

En Java 1.6, LinkedList implementa Deque (cola de doble finalización). A partir de las: Deque.element() javadocs

Recupera, pero no elimina, el la cabeza de la cola representada por este deque (dicho de otro modo, la primera elemento de este deque). Este método difiere de peek solo en que arroja una excepción si esta deque es vacía.

Este método es equivalente a getFirst().

En Java 1.5, LinkedList tiene ambos métodos, pero getFirst() no está respaldada por una interfaz. Supongo que en Java 1.6 implementaron Deque intencionalmente para incluir este método.

En Java 1.4, LinkedList solo tiene el getFirst(), pero no está respaldado por una interfaz.

Obviamente, yo diría que este es un problema de mantener la compatibilidad hacia atrás:

  • LinkedList 1,4 tiene GetFirst() y sólo el List interfaz
  • LinkedList 1.5 implementos Queue y por lo tanto tiene que apoyar el equivalente elements() método
  • LinkedList 1,6 implementos Deque sino porque a) tiene que permanecer compatible hacia atrás y b) por la política, todos los métodos deben ser respaldados por las interfaces, la interfaz Deque también incluye el duplicado método
+0

"LinkedList 1.5 implementa Queue y por lo tanto necesita soportar el método de elementos equivalentes()" - para recuperar el primer elemento en una cola (que es lo que hace el elemento()), ¿no tiene sentido usar simplemente getFirst() ¿algo que se estableció desde 1.4? (Estoy tratando de aclararlo, no estoy tratando de disputar). – user183037

+0

@ user183037 en 1.4, LinkedList tenía 'getFirst()' y Queue tenía 'element()' pero LinkedList aún no implementaba Queue. Más tarde, cuando lo hace, ambos métodos son necesarios para la compatibilidad con versiones anteriores (aunque su contrato es igual) –

+0

Retiro eso, me acabo de dar cuenta de que Queue solo se introdujo en 1.5. No, estoy desconcertado. Supongo que no querían el nombre del elemento() en la interfaz de Queue. –

Cuestiones relacionadas