¿Cómo declarar un ArrayList? [duplicar]

Posible duplicado:
¿Por qué debería preferirse la interfaz para una clase Java?

Soy relativamente nuevo en Java y acabo de comenzar con el marco de colecciones. Mientras tanto ArrayList Me encontré con dos formas en que la gente lo declara. Por ejemplo para declarar un ArrayList of Strings:

List<String> l = new ArrayList<String>();

or

ArrayList<String> al = new ArrayList<String>();

¿Cuál de estos dos debo usar y cuál es la diferencia entre ellos?

Sé que los métodos reales llamados se deciden en tiempo de ejecución y, por lo tanto, todos los métodos llamados serán de ArrayList clase solamente, pero aún así la primera declaración restringe los métodos que se pueden llamar.

La primera forma, según he oído, se llama "codificación para una interfaz". Cualquier método será invocado usando la variable l y por lo tanto sólo los métodos proporcionados por List se puede llamar a la interfaz, mientras que, en el segundo ejemplo, podemos llamar a todos los métodos provistos no solo por List pero por el Object clase también (como finalize(), wait() etc.). Entonces, ¿por qué, incluso en primer lugar, la gente usa la primera declaración?

preguntado el 12 de junio de 12 a las 15:06

todavía puedes acceder Object métodos de clase con l ejemplo. -

@PrinceJohnWesley: ¿cómo puedo desde l es una referencia de una interfaz y las interfaces no pertenecen a la Object jerarquía de clases? -

cada objeto es Object tipo. List<T> es el subtipo de Object -

pero List es una interfaz y he leído que las interfaces no pertenecen a la jerarquía de clases, entonces, ¿cómo puede ser un subtipo de Object si ni siquiera lo alarga?? -

El punto es que aún puede referirse a objetos por una de las interfaces que implementa su clase respectiva. Entonces, cuando dices "Lista l", te refieres a "Un objeto de una clase u otra que implementa la Lista". Y luego puede llamar a cualquier método de la lista de interfaz en 'l'. También puede llamar a cualquier método público en Object, solo porque puede hacerlo (Object es una clase especial). -

2 Respuestas

Siempre debe usar la interfaz menos específica posible. Esto facilita la sustitución de implementaciones alternativas si existe una más apropiada. Por ejemplo, los métodos que toman List no importa si la lista es una lista enlazada o una lista de matriz. Puedes elegir el que sea más apropiado.

Respondido el 12 de junio de 12 a las 16:06

Entonces, ¿la única razón para usar la primera forma es que podemos pasarla como argumento a una gama más amplia de métodos? incluso si restringe los métodos que se pueden llamar desde sí mismo? - Rendirse Thakran

Solo hay un puñado de métodos en ArrayList que no están en List, y es poco probable que desee llamarlos. Cuando digo "la interfaz menos específica posible", me refiero a "usar una interfaz que tenga todos los métodos que desea llamar y no más". - sjr

@SurenderThakran Sí, restringir los métodos generalmente se considera algo bueno. Solo dé acceso a los datos y métodos que sean necesarios. Esto reduce la complejidad y, a la larga, reduce el tiempo de mantenimiento y los errores. En una nota personal, también aparecen menos métodos en el menú contextual; No tendría en cuenta eso en una decisión de diseño muy importante, pero es una buena ventaja :) - Córcega

@sjr Iba a pedirte una aclaración sobre "lo menos específico posible", pero me ganaste. Su aclaración es (en mi humilde opinión) la manera perfecta de articular las mejores prácticas cuando se trata de interfaces. - Córcega

¿Pueden arrojar algo de luz sobre la pregunta que hice en los comentarios debajo de la pregunta? - Rendirse Thakran

Yo personalmente recomiendo usar List<String> l = new ArrayList<String>();

La razón es que normalmente no necesita saber que está trabajando con una ArrayList. Solo necesitas algo que funcione como una lista. Hay muchos comportamientos en ArrayList a los que las personas no necesitan acceder. Considere "EnsureCapacity". No necesitan eso, solo necesitan las operaciones de lista. Como regla general, desea limitar la exposición de los datos y la funcionalidad según la "necesidad de saber", y los usuarios de su lista no necesitan saber (de forma predeterminada) qué implementación utilizó.

Obviamente, si necesitan saber que estás usando una ArrayList en lugar de una LinkedList, por ejemplo, entonces querrás usar una referencia ArrayList en lugar de una referencia List. Sin embargo, para la mayoría de los propósitos, eso no es necesario.

Respondido el 12 de junio de 12 a las 16:06

si pero usando List también restringe los métodos que se pueden llamar desde él como he mencionado en la pregunta. También lo son los métodos proporcionados fuera de List ¿No es tan importante que elijamos ignorarlos para encapsularlos? - Rendirse Thakran

Correcto, vea mi respuesta en la respuesta de sjr. - Córcega

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.