Lista frente a ArrayList como tipo de referencia?

Ok, sé que Set , List y Map son interfaces, pero ¿qué hace que la primera línea de código sea mejor que la segunda línea?

 List myArr = new ArrayList(); ArrayList myArr = new ArrayList(); 

Si utiliza el primer formulario, está diciendo que todo lo que siempre va a utilizar es la funcionalidad de la interfaz de la List , nada más, especialmente nada extra agregado por la implementación de la misma. Esto significa que puede cambiar fácilmente la implementación utilizada (por ejemplo, simplemente sustituya LinkedList por ArrayList en la creación de instancias) y no se preocupe porque rompa el rest del código porque es posible que haya utilizado algo específico de ArrayList .

Un principio general útil acerca de los tipos en la progtwigción (a veces denominado principio de robustez ) es el siguiente:

  • Sé liberal sobre lo que aceptas
  • Sé conservador con respecto a lo que emites

List es más liberal que ArrayList, ya que List puede ser cualquier tipo de implementación de List, por ejemplo, ArrayList, LinkedList o FrancosSpecialList. Por lo tanto, es una buena idea ser liberal y aceptar cualquier tipo de lista ya que es posible que desee cambiar la implementación más adelante.

La razón principal para usar ArrayList explícitamente como tipo (su segundo caso) es si necesita usar métodos que son específicos de ArrayList que no están disponibles a través de la interfaz de la Lista. En este caso, una Lista genérica no funcionará (a menos que desee hacer muchos lanzamientos feos y confusos), por lo que también podría ser explícito y utilizar una ArrayList directamente. Esto tiene la ventaja adicional de insinuarle a un lector que se necesitan características específicas de ArrayList.

Como puede ver en la fuente de ArrayList aquí , la mayoría de los métodos implementados están anotados como @override porque todos ellos están definidos a través de la interfaz de List , por lo tanto, si va a usar solo funcionalidades básicas (eso es lo que va a hacer más del tiempo) la diferencia no será práctica.

La diferencia vendrá si algún día piensas que las características de ArrayList ya no son adecuadas para tu tipo de problema y necesitarás algo diferente (una LinkedList por ejemplo). Si declara todo como List pero crea una instancia como ArrayList , cambiará fácilmente a una nueva implementación cambiando las instancias a la new ArrayList() mientras que en otro caso tendrá que cambiar también todas las declaraciones de variables.

Usar List list = new ArrayList() es más estilo OOP ya que declara que no le importa la implementación específica de la lista, y que desea descartar la información estática sobre el tipo, ya que dependerá de la interfaz proporcionada por este tipo de colección que abstrae de su implementación.