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
Respuesta
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á.
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'. –
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>
.
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>();
.
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.
¿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. –
@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
http://developer.android.com/guide/practices/design/performance.html#myths. para ser justos, esta afirmación se refiere a las JVM sin un JIT. –
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.
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)
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
.
En realidad, sería mejor si se parametrizara ya que ambos son tipos sin formato.
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.
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......
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"
- 1. Java LinkedList anterior siguiente
- 2. Java LinkedList a matlab array
- 3. Java: ¿Imprimir LinkedList sin corchetes?
- 4. ¿Cómo funciona LinkedList internamente en Java?
- 5. Java: inversión de LinkedList en fragmentos
- 6. ) impl clara (en LinkedList de Java
- 7. Intercambiar elementos en LinkedList
- 8. Cómo declarar una constante en Java
- 9. Confirmar LinkedList de Java "foreach" bucle
- 10. "LinkedList no es genérica" error de Java
- 11. ¿Cómo se agrega una LinkedList <T> a una LinkedList <T> en C#?
- 12. ¿Cómo puedo inicializar una LinkedList con entradas/valores en ella?
- 13. LinkedList: eliminar un objeto
- 14. Creación de una clase LinkedList desde cero
- 15. Java - Declarar matrices
- 16. Creación de linkedList en java directamente si conocemos los elementos
- 17. ¿Cómo declarar una matriz de objetos dinámicos en Java?
- 18. ¿Es posible declarar una variable de 1 bit en Java?
- 19. ¿Cuál es la complejidad de tiempo de una llamada a size() en LinkedList en Java?
- 20. Cómo declarar y consumir eventos en Java
- 21. Declarar la variable enum en Java bean
- 22. Plantillas C++ - LinkedList
- 23. Escribiendo un destructor LinkedList?
- 24. ¿Cómo declarar una constante local en C#?
- 25. ¿LinkedList en .NET es una lista circular vinculada?
- 26. Por qué ArrayDeque es mejor que LinkedList
- 27. Caso de uso para LinkedList
- 28. Una cola rápida en Java
- 29. Cómo atravesar C# LinkedList en orden inverso
- 30. Java: Spring Framework: Declarar anidadas Mapas
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. –
Depende de lo que quiera lograr, mira esto: [verifica tu respuesta] [1] aquí http://stackoverflow.com/questions/2451849/polymorphic-call –
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