2012-09-26 21 views
6

Duplicar posible:
Collections.emptyList() vs. new instance¿Por qué alguien usaría Collections.emptyList en java?

yo estaba tratando de comprender la diferencia entre crear una nueva instancia de una lista usando:

new ArrayList<X> 

y

Collections.emptyList(); 

Según tengo entendido, el último devuelve una lista inmutable. Eso significa que no es posible agregarlo, eliminarlo o modificarlo. Quiero saber por qué uno crearía e inmutable emptyList? ¿cuál es el uso? gracias

+0

respondió Posiblemente [aquí] (http://stackoverflow.com/questions/5552258/collections-emptylist-vs-new-instance) –

+2

inmutabilidad es bueno para usted ! –

Respuesta

13

Supongamos que debe devolver una colección y no desea crear un par de objetos cada vez.

interface Configurable { 
    List<String> getConfigurationList(); 
} 

// class which doesn't have any configuration 
class SimpleConfigurable implements Configurable { 
    public List<String> getConfigurationList() { return Collections.emptyList(); } 
} 

Volviendo una colección vacía es a menudo preferible a regresar null

+5

¿Qué sucede si el cliente de SimpleConfigurable Class intenta agregar elementos a la lista vacía devuelta por getConfigurationList(); – param

+1

Reciben una excepción, que es probablemente lo que usted quiere como diseñador de 'SimpleConfigurable'. Si puedo parafrasear el argumento completo [programación pura] (wikipedia.org/wiki/Pure_function), ¿cuál es la semántica de una función que devuelve un objeto mutable? ¿Tomará alguna medida tu biblioteca si alguien agrega un elemento al valor de retorno (por ej .: actualizar la configuración aplicada)? ¿Su biblioteca guardará en caché la instancia devuelta para la siguiente llamada de 'getConfigList()'? ¿Cómo haces que todo este thread-safe? Devolver una lista no modificable nos da una respuesta muy simple para cada una de estas preguntas. – Groostav

+0

@Groostav Devolver una Lista no modificable es lo mejor a menos que a) desee una modificación por diseño b) la haya perfilado como un problema de rendimiento. –

12

Al ser inmutable permite instancias reutilizables.

Collections.emptyList siempre devolverá la misma instancia singleton.

Esto es muy eficiente.

Además de eso, los datos inmutables se pueden compartir de forma segura entre subprocesos, y se garantiza que evitan extraños efectos secundarios debido a errores de codificación. Por esa razón, también hace innecesarias las copias defensivas.

7

A menudo uso listas vacías como Null objects: esto evita tener que verificar null.

+0

Pero, de todos modos, ni siquiera podemos usar get() sobre él, entonces ¿cuál es el beneficio? Una de las ventajas que encontré es que podemos iterar sobre ella opuesta a nula. –

+0

Se pueden llamar otros métodos típicos usados ​​condicionalmente como 'size()', 'isEmpty()'. – sevenforce

5

que he usado para Collections.emptyList métodos que devuelven una lista, pero que son llamados con argumentos que no tienen sentido.

Por ejemplo, una aplicación de procesamiento de flujo en la que desea acceder a diferentes partes de la secuencia, tal vez en función de las fechas. Hace una consulta para un lapso de tiempo de los elementos de la transmisión, pero si no hay elementos en ese lapso de tiempo, devolverá una lista vacía. Lanzar una excepción no tendría ningún sentido ya que no hay nada de malo con la consulta. Devolver null tampoco tiene mucho sentido porque entonces todo el código de la llamada necesita comprobar null.

Al devolver una lista vacía inmutable permite que el código de llamada maneje bien el valor de retorno, no necesita preocuparse por los problemas de subprocesamiento ya que una lista inmutable es inherentemente segura para subprocesos.

2

Para evitar NullPointerException no deseado.

En su código, puede devolver un ArrayList "vacío" normal en lugar de devolver nulo. Pero, de esa manera, seguirás creando objetos NUEVOS (con una capacidad predeterminada de 10) en cada ejecución que no es un enfoque de memoria eficiente. En lugar de eso, si devuelve emptyList, se devolverá la misma instancia en cada invocación. De esta forma, te ahorra la NullPointerException no deseada de una manera más eficiente.Aquí está el recorte del Javadoc para emptyList:

/** 
* Returns the empty list (immutable). This list is serializable. 
* 
* <p>This example illustrates the type-safe way to obtain an empty list: 
* <pre> 
*  List&lt;String&gt; s = Collections.emptyList(); 
* </pre> 
* Implementation note: Implementations of this method need not 
* create a separate <tt>List</tt> object for each call. Using this 
* method is likely to have comparable cost to using the like-named 
* field. (Unlike this method, the field does not provide type safety.) 
* 
* @see #EMPTY_LIST 
* @since 1.5 
*/ 
Cuestiones relacionadas