La principal diferencia es que Collections.emptyList()
devuelve una lista inmutable , es decir, una lista a la que no puede agregar elementos. (Lo mismo se aplica a lo List.of()
introducido en Java 9.)
En los raros casos en que no desea modificar la lista devuelta, Collections.emptyList()
y List.of()
por lo tanto son no unas buenas opciones.
Yo diría que devolver una lista inmutable está perfectamente bien (e incluso la forma preferida) siempre que el contrato (documentación) no establezca de manera explícita de manera diferente.
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 separado para cada llamada. Es probable que el uso de este método 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
looks de la siguiente manera:
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
Entonces, si su método (que devuelve una lista vacía) se llama con mucha frecuencia, este enfoque puede incluso brindarle un rendimiento ligeramente mejor tanto en CPU como en memoria.
Collections.emptyList()
sería más adecuado para, digamos, verificación de errores y similares?NullPointerException
regresando enCollections.emptyList()
lugar denull
.Collections.emptyList()
es iterable y devuelve una longitud, por lo que puede usarse para bucles sin que se produzca una excepción.List.of()
?new ArrayList<>()
también aclara la decisión de diseño; los elementos no se agregarán a esta lista.Comenzando con Java 5.0, puede especificar el tipo de elemento en el contenedor:
Estoy de acuerdo con las otras respuestas de que para los casos en que desea devolver una lista vacía que permanezca vacía, debe usar este enfoque.
fuente
List<Foo> list = Collections.emptyList()
Collections.emptyList
es inmutable, por lo que hay una diferencia entre las dos versiones, por lo que debe considerar a los usuarios del valor devuelto.La devolución
new ArrayList<Foo>
siempre crea una nueva instancia del objeto, por lo que tiene un costo adicional muy pequeño asociado, lo que puede darle una razón para usarloCollections.emptyList
. Me gusta usaremptyList
solo porque es más legible.fuente
Pero ten cuidado. Si regresa
Collections.emptyList()
y luego intenta hacer algunos cambios con él comoadd()
o algo así, tendrá unUnsupportedOperationException()
porqueCollections.emptyList()
devuelve un objeto inmutable.fuente
Iría con
Collections.emptyList()
si la lista devuelta no se modifica 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 la misma instancia estática se devuelve cada vez y, por lo tanto, no se produce una creación de instancia para cada llamada.fuente
Use Collections.emptyList () si desea asegurarse de que la lista devuelta nunca se modifique. Esto es lo que se devuelve al llamar a emptyList ():
fuente
Collections.emptyList()
tenía un costo de construcción. Ver los detalles de implementación (aunque probablemente no sea el mismo en todas las JVM) confirma que no es así. @ Atul, ¿de qué JVM es esto?Las respuestas dadas enfatizan el hecho de que
emptyList()
devuelve un valor inmutableList
pero no dan alternativas. LosArrayList(int initialCapacity)
casos especiales de Constructor ,0
por lo que regresar ennew ArrayList<>(0)
lugar denew ArrayList<>()
también podría ser una solución viable:[...]
(fuentes de Java 1.8.0_72)
fuente