2012-03-23 19 views
9

siempre aprendo cuando declaramos una colección que debemos hacer, Interface ob = new Class(), si quiero usar por ejemplo un LinkedList que voy a hacer List ob = new LinkedList(), pero entonces no puede tener acceso a todos los métodos de LinkedList .. ¿No es LinkedList ob = new LinkedList() 100% correcto?Declarar una LinkedList en Java

+1

LinkedList ob = new LinkedList(), la creación de objetos de esta manera es solo lo que desea utilizar la clase LinkedList, no tiene nada de malo. De nuevo, depende de lo que desee de una implementación. –

+1

Depende de lo que quiera lograr, mira esto: [verifica tu respuesta] [1] aquí http://stackoverflow.com/questions/2451849/polymorphic-call –

+0

Buena Q, Marcio. Justo ahora, me encontré con una situación en la que quería utilizar 'addFirst (E e)' y 'addLast (E e)', pero no pude encontrarlos en la interfaz 'List'. – Vikram

Respuesta

10

No es LinkedList ob = new LinkedList() 100% correcto?

Bueno me gustaría sugerir el uso de la forma genérica, pero seguro - si desea utilizar la funcionalidad que es específica a LinkedList, tiene que declarar la variable en consecuencia.

Es posible que desee comprobar si las interfaces Deque<E> o Queue<E> tienen lo que usted desea. Si lo hacen, utilícelos de acuerdo con la idea de describir lo que necesita en lugar de qué implementación usará.

+3

No hay ningún método _specific_ para 'LinkedList'; todo reemplaza un método de superclase (como 'clone()') o implementa un método de una de sus interfaces. Si desea utilizar métodos especificados por 'Deque' (por ejemplo,' peek() ') así como los métodos especificados por' List' (por ejemplo, 'indexOf()'), pero no especificados por ambos, entonces no hay mucha alternativa para declarar que la variable es 'LinkedList'. –

5

Sí,

LinkedList<...> items = new LinkedList<...>(); 

es perfectamente correcto si se sabe que items dependerá de los métodos de LinkedList<T> que no son capturados en la interfaz List<T>.

1

No exactamente 100% correcto.

Una forma preferida de declarar cualquier colección es incluir el tipo de datos que contiene. Entonces, para su ejemplo, sería LinkedList<Integer> ob = new LinkedList<Integer>();.

3

la regla "siempre codificar a las interfaces" se debe tomar con cierta flexibilidad. lo que estás sugiriendo está bien, y cuando llegaste a la conclusión, la única opción.

como nota al margen, la codificación de clases concretas como esta es más rápida es la mayoría de las JVM. Decidir si vale la pena romper la regla es lo difícil de decidir.

+2

¿Tiene algunos datos para respaldar este reclamo? Es la primera vez que escucho que la codificación en las interfaces puede ser más lenta que en las clases concretas. –

+0

@krzyk - No es muy difícil probarlo usted mismo. Las llamadas a métodos a algo como 'list.get()' son considerablemente más lentas (si se hacen suficientes) cuando 'list' se declara' List 'que cuando se declara' ArrayList '. (Para probar 'get()', no usaría 'LinkedList'.) En una prueba simple ejecuté bajo Java 6, que acaba de acceder a cada elemento de la matriz usando' get() ', las llamadas genéricas tomaron aproximadamente 10% más por 1,000 elementos, y aproximadamente 18% más por 10,000 elementos. –

+0

http://developer.android.com/guide/practices/design/performance.html#myths. para ser justos, esta afirmación se refiere a las JVM sin un JIT. –

3

Si realmente necesita utilizar métodos que no están en la interfaz de la Lista, no hay nada de malo con el uso de la API de LinkedList. La regla general de programación para la interfaz de la Lista reconoce que 1) es muy raro que necesite esos métodos, y 2) en la experiencia de la mayoría de la gente, es más probable que descubra que necesito ordenar la lista y/o uso mucho aleatorio acceso, y decide cambiar a una ArrayList, de lo que es, necesito uno de los métodos que solo tiene LinkedList.

También es posible que pueda programar en la interfaz Queue, si encuentra que List no le proporciona lo que necesita.

2

LinkedList es un genérico. Que debería estar haciendo:

LinkedList<String> linkedList = new LinkedList<String>(); 

(o cualquier otra cosa que necesita para almacenar allí en lugar de cuerdas)

4

Siempre debe tratar de mantener la declaración al más alto nivel posible, lo que significa que usted debe pare en el nivel más alto que proporciona toda la funcionalidad que necesita: si los métodos List no son suficientes, está perfectamente bien con su declaración LinkedList.

-2

En realidad, sería mejor si se parametrizara ya que ambos son tipos sin formato.

1

No .. Esto sería incorrecto, en las etapas posteriores si quiere cambiar su implementación de la lista vinculada a cualquier otra implementación del tipo de lista, se equivocará ... Mejor utilizar la declaración de nivel de interfaz.

0

no siempre le sugerirá que use genéricos ..... Coz veces puede ser necesario para envolver diferentes objetos como aquí ....

  String str="a string"; 
      boolean status=false; 

      LinkedList ll = new LinkedList(); 
      ll.add(str); 
      ll.add(status); 

En algunas situaciones como el caso de la RMI, solo puede enviar datos serializados ..... y suponga que desea enviar un objeto de clase (que está sin serializar) ....... Allí puede envolver los miembros de la clase (primitivos) en una Lista Vinculada y pasar ese objeto como un todo ....... no se preocupe por la gran cantidad de argumentos ...... Considere por ejemplo:

 public Class DataHouse 
     { 
      public int a; 
      public String str; 
      . 
      . 
      . 
     } 
Ahora

En algún lugar u necesidad de pasar los objetos .... Usted puede hacer lo siguiente ....

   DataHouse dh =new DataHouse(); 
      LinkedList ll = new LinkedList(); 
      ll.add(dh.a); 
      ll.add(dh.str); 

      // Now the content is serialized and can pass it as a capsuled data...... 
0

todavía puede tener acceso a los métodos ListaEnlazada mediante el uso de la lista, todo lo que tiene que hacer es tipo fundido por ejemplo

((LinkedList)ob).add() 

el punto de usar la lista genérica y no LinkedList se debe a que en caso de que simplemente cambia el tipo de listas que está usando (digamos lista doblemente enlazada) su programa seguirá funcionando genéricos son a simplifique su código para ser más portátil y más "cambiable"