2012-09-26 12 views
6

Eventuali duplicati:
Collections.emptyList() vs. new instancePerché qualcuno dovrebbe utilizzare Collections.emptyList in java?

stavo cercando di capire la differenza tra creare una nuova istanza di una lista usando:

new ArrayList<X> 

e

Collections.emptyList(); 

Come ho capito, la successiva restituisce una lista immutabile. Ciò significa che non è possibile aggiungerlo, cancellarlo o modificarlo. Voglio sapere perché si dovrebbe creare una lista vuota e immutabile? qual è l'uso? grazie

+0

Possibilmente risposta [qui] (http://stackoverflow.com/questions/5552258/collections-emptylist-vs-new-instance) –

+2

immutabilità è buono per voi ! –

risposta

13

Dire che devi restituire una collezione e non vuoi creare un paio di oggetti ogni volta.

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

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

Tornando un insieme vuoto è spesso preferibile tornare null

+5

Cosa succede se il client della classe SimpleConfigurable tenta di aggiungere elementi all'elenco vuoto restituito da getConfigurationList(); – param

+1

Ottengono un'eccezione, che probabilmente è ciò che si desidera come progettista di 'SimpleConfigurable'. Se posso parafrasare l'intero argomento [pure-programming] (wikipedia.org/wiki/Pure_function), quali sono le semantiche di una funzione che restituisce un oggetto mutabile? La tua biblioteca prenderà qualche azione se qualcuno aggiunge un elemento al valore di ritorno (es: aggiorna la configurazione applicata)? La tua libreria memorizza nella cache l'istanza restituita per il prossimo chiamante di 'getConfigList()'? Come si fa a rendere tutto questo thread-safe? La restituzione di un elenco non modificabile ci fornisce una risposta molto semplice a ciascuna di queste domande. – Groostav

+0

@Groostav La restituzione di una lista non modificabile è la migliore a meno che tu non desideri modificare la progettazione b) l'hai definita come problema di prestazioni. –

12

Essendo immutabile consente istanze riutilizzabili.

Collections.emptyList restituirà sempre la stessa identica istanza singleton.

Questo è molto efficiente.

In aggiunta a ciò, i dati immutabili possono essere condivisi in modo sicuro tra thread ed è garantito per evitare strani effetti collaterali dovuti a errori di codifica. Per questo motivo anche le copie difensive non sono necessarie.

7

Uso spesso elenchi vuoti come Null objects: evitare di controllare null.

+0

Ma comunque non possiamo nemmeno usare get() su di esso, allora qual è il vantaggio? Uno dei vantaggi che ho trovato è che possiamo scorrere su di esso opposto a null. –

+0

Altri metodi tipici usati come "size()", "isEmpty()" possono essere chiamati. – sevenforce

5

Ho usato Collections.emptyList per i metodi che restituiscono un elenco ma che sono chiamati con argomenti che non hanno senso.

Ad esempio un'applicazione di elaborazione del flusso in cui si desidera accedere a parti diverse dello stream, magari in base alle date. Esegui una query per un intervallo di tempo degli elementi dallo stream, ma se non ci sono elementi in questo intervallo di tempo restituirai una lista vuota. Lanciare un'eccezione non avrebbe alcun senso dal momento che non c'è nulla di sbagliato nella query. Restituire null non ha molto senso perché quindi tutto il codice di chiamata deve controllare null.

La restituzione di una lista vuota immutabile consente al codice chiamante di gestire correttamente il valore restituito, non è necessario preoccuparsi di problemi di thread poiché un elenco immutabile è intrinsecamente thread-safe.

2

Per evitare NullPointerException indesiderato.

Nel codice, è possibile restituire un normale ArrayList "vuoto" invece di restituire null. In tal modo, continuerai a creare nuovi oggetti (con una capacità predefinita di 10) su ciascuna esecuzione che non è un approccio efficiente alla memoria. Invece di restituire emptyList, la stessa istanza verrà restituita ad ogni richiamo. In questo modo si salva da indesiderati NullPointerException in un modo più efficiente.Ecco l'insulsa dal Javadoc per 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 
*/ 
Problemi correlati