2015-02-21 25 views
5

So che è una questione semplice, ma voglio porre questa domanda. Supponiamo che io abbia un metodo get che restituisca un oggetto ArrayList. Per prima cosa dobbiamo restituirne una copia? In tal caso, deve essere una copia profonda di ArrayList? Abbiamo ancora bisogno di fare una copia profonda quando gli oggetti al suo interno sono immutabili? Se si utilizza questo tipo di costruttoreCopia profonda quando si utilizza ArrayList in java

ArrayList<T> arr = new ArrayList<>(collection); 

poi sono gli elementi della matrice copiato o ancora il punto ai vecchi valori? Grazie

risposta

6

Dipende dal tuo caso d'uso. A volte è preferibile esporre la raccolta sottostante, a volte non lo è.

Se si desidera ad esempio sfruttare i metodi di raccolta per la classe, è possibile restituire la raccolta sottostante (o una vista modificabile della raccolta sottostante). Ciò consente ai clienti della classe a fare, per esempio

phoneBook.getPeople().removeIf(Person::isAddressInvalid); 

Se non vuole esporre la collezione sottostante Vorrei andare con

return new ArrayList<>(yourCollection); 

Penso che sia molto raro restituire una copia profonda in un metodo get.

+0

Ok, se il tipo è String, posso restituirlo in questo modo: restituisce nuovo ArrayList <> (yourCollection); – user2735714

+2

Assolutamente. Le stringhe sono immutabili, quindi restituire una copia profonda delle stringhe è particolarmente inutile. – aioobe