Collections.emptyList () vs. nueva instancia

En la práctica, es mejor devolver una lista vacía como esta :

return Collections.emptyList(); 

O así:

 return new ArrayList(); 

¿O es esto completamente dependiente de lo que vas a hacer con la lista devuelta?

La diferencia principal es que Collections.emptyList() devuelve una lista inmutable , es decir, una lista a la que no puede agregar elementos.

En los casos poco frecuentes en los que desee modificar la lista devuelta, esto no sería una opción.

Diría que devolver una lista inmutable está perfectamente bien (e incluso de la manera preferida) siempre que el contrato (documentación) no indique explícitamente lo contrario.


Además, emptyList() podría no crear un nuevo objeto con cada llamada.

Las implementaciones de este método no necesitan crear un objeto List por separado para cada llamada. Usar este método probablemente tenga un costo comparable al uso del campo con el mismo nombre. (A diferencia de este método, el campo no proporciona seguridad de tipo).

La implementación de emptyList ve de la siguiente manera:

 public static final  List emptyList() { return (List) EMPTY_LIST; } 

Entonces, si su método (que devuelve una lista vacía) se llama con mucha frecuencia, este enfoque puede brindarle un rendimiento ligeramente mejor tanto en la CPU como en la memoria.

A partir de Java 5.0 puede especificar el tipo de elemento en el contenedor:

 Collections.emptyList() 

Estoy de acuerdo con las otras respuestas en que, para los casos en que desee devolver una lista vacía que permanezca vacía, debe usar este enfoque.

Collections.emptyList es inmutable, por lo que existe una diferencia entre las dos versiones, por lo que debe tener en cuenta a los usuarios del valor devuelto.

La new ArrayList siempre crea una nueva instancia del objeto, por lo que tiene un muy pequeño costo adicional asociado que puede darle una razón para usar Collections.emptyList . Me gusta usar emptyList solo porque es más legible.

Sin embargo, ten cuidado. Si devuelve Collections.emptyList() y luego intenta hacer algunos cambios con él como add() o smth así, tendrá una UnsupportedOperationException() porque Collections.emptyList() devuelve un objeto inmutable.

Me gustaría ir con Collections.emptyList() si la lista devuelta no se está modificando de ninguna manera (ya que la lista es inmutable), de lo contrario iría con la opción 2.

El beneficio de Collections.emptyList() es que se devuelve la misma instancia estática cada vez y, por lo tanto, no se produce creación de instancia para cada llamada.

Use Collections.emptyList () si desea asegurarse de que la lista devuelta nunca se modifique. Esto es lo que se devuelve al llamar a emptyList ():

 /** * The empty list (immutable). */ public static final List EMPTY_LIST = new EmptyList(); 

Las respuestas dadas enfatizan el hecho de que emptyList() devuelve una List inmutable pero no da alternativas. Los casos especiales de Constructor ArrayList(int initialCapacity) 0 por lo que devolver una new ArrayList<>(0) lugar de una new ArrayList<>() también podría ser una solución viable:

 /** * Shared empty array instance used for empty instances. */ private static final Object[] EMPTY_ELEMENTDATA = {}; 

[…]

 /** * Constructs an empty list with the specified initial capacity. * * @param initialCapacity the initial capacity of the list * @throws IllegalArgumentException if the specified initial capacity * is negative */ public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } } 

(fonts de Java 1.8.0_72)