2012-06-13 26 views
5

Soy nuevo en Java y cuando reviso el código de muchos ejemplos en la red veo personas que declaran la variable ArrayList como simplemente List en casi todos los casos.¿Por qué asignar una nueva ArrayList a una variable de lista?

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

No entiendo si hay alguna ventaja específica de hacer esto. Por qué no puede ser un ArrayList en sí, así:

ArrayList<String> myList = new ArrayList<String>(); 
+2

Tendrá que cambiar su idioma: Esto no involucra el casting en lo más mínimo. En ninguna parte ves un lanzamiento, '(List)' se está utilizando. –

+1

Creo que está cubierto: http://stackoverflow.com/questions/4062982/list-versus-arraylist, http://stackoverflow.com/questions/9852831/why-use-list-list-new-arraylist-instead- of-arraylist-list-new-arraylist, http://stackoverflow.com/questions/147468/why-should-the-interface-for-a-java-class-be-prefered :-) –

Respuesta

9

Se llama programming to an interface. Le permite sustituir ese ArrayList por un LinkedList si en algún punto de la línea usted decide que un LinkedList sería más apropiado.

+3

Aunque, la primera frase está bien, ... _Te permite sustituir ese ArrayList por una LinkedList si en algún momento, decides que una LinkedList sería más apropiada._ no suena bien –

+1

@OpDeCirkel ¿Qué le parece mal? Esa es una de las ventajas de programar en una interfaz. – Jeffrey

3

Porque si decide cambiar más adelante es más fácil:

List<String> myList = new ArrayList<String>(); 
List<String> myList = new LinkedList<String>(); 

Es más importante en firmas de método, cuando se cambia lo que de regreso se puede forzar a todos el uso de su función para cambiar su código.

2

Esto no es un molde, sino que está utilizando la interfaz como el tipo declarado de la variable. La razón para hacer esto es que puede cambiar qué implementación de la Lista está utilizando. Si los usuarios de la lista solo dependen de la interfaz de la Lista, no se verán afectados si usa otro tipo de lista, como LinkedList.

+0

Supongo que, en lugar de decir _interface como el tipo declarado_, quiere decir _interface como el tipo declarado de una variable_. –

+0

editado para aclarar –

1

Java es un lenguaje fuertemente orientado a objetos. .... Veamos un ejemplo: supongamos que está escribiendo una función de ordenación sort(ArrayList<> list). Si la función se declara de esa manera, java no le permitirá ordenar nada más con esa función que ArrayList. Mejor enfoque sería definir una abstracción (como en su pregunta es) List. En esa abstracción declaras métodos. que todas las implementaciones deben implementar-definir (es decir, ArrayList). Ahora su función sort se puede declarar como sort(List<> list) y puede ordenar con cualquier cosa que implemente List (y sigue el contrato de los métodos List).
De esta manera se puede reutilizar código que usted escribió para todas sus implementaciones , siempre y cuando obedezcan el contrato de la abstracción . En Java lo logra usando interfaces como abstracciones y clases como implementaciones. También hay otras ventajas, pero ha leído algún libro sobre programación orientada a objetos si quiere entenderlos mejor.

1

La lista es una interfaz, por lo que puede almacenar referencias a todas las clases desde la Interfaz de lista. Si utilizó la siguiente declaración, luego de algunos pasos de programación también puede almacenar otros objetos (que se extienden desde la lista).

List<String> myList = new ArrayList<String>(); 
... 
myList =new LinkedList<String>(); 

La principal ventaja viene con esto es el mantenimiento del código. Por ejemplo, si alguien viene y quiere usar una Lista Enlazada en lugar de una Lista de Arreglos, solo necesita cambiar una línea en lugar de tropecientos en todo el código. Hace que tu código sea un poco más flexible.

Todo el concepto de polimorfismo en Java se basa en la capacidad de java de utilizar la referencia de clase de interfaz/base para hacer referencia a objetos de clase secundaria.

Además, la programación de una interfaz en lugar de la implementación real siempre se considera una buena práctica. Esto permitiría al desarrollador reemplazar una implementación con otra/mejor implementación fácilmente cuando sea necesario.

0

1) List es una interfaz, la clase de implementación es ArrayList
2) List interfaz extiende Collection.

Cuestiones relacionadas