2015-02-21 5 views
5

Ich weiß, dass es eine triviale Angelegenheit ist, aber ich möchte diese Frage stellen. Angenommen, ich habe eine get-Methode, die eine ArrayList von Objekten zurückgibt. Zuerst müssen wir eine Kopie davon zurückgeben? Wenn ja, muss es eine tiefe Kopie der ArrayList sein? Müssen wir noch eine tiefe Kopie machen, wenn die Objekte darin unveränderlich sind? Wenn wir diese Art von KonstruktorTiefe Kopie bei der Verwendung von ArrayList in Java

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

dann werden die Elemente des Arrays kopiert oder sie weisen noch auf die alten Werte? Danke

Antwort

6

Es hängt von Ihrem Anwendungsfall ab. Manchmal ist es wünschenswert, die zugrunde liegende Sammlung verfügbar zu machen, manchmal nicht.

Wenn Sie beispielsweise die Erfassungsmethoden für Ihre Klasse nutzen möchten, können Sie die zugrunde liegende Sammlung (oder eine änderbare Ansicht der zugrunde liegenden Sammlung) zurückgeben. Diese Kunden Ihrer Klasse ermöglicht,

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

zum Beispiel zu tun, wenn Sie die zugrunde liegende Sammlung nicht wollen aussetzen ich mit

return new ArrayList<>(yourCollection); 

gehen würde, ich denke, es ist sehr selten Gibt eine tiefe Kopie in einer get-Methode zurück.

+0

Ok was ist, wenn der Typ String ist, dann kann ich es auf diese Weise zurückgeben: return new ArrayList <> (yourCollection); – user2735714

+2

Absolut. Strings sind unveränderlich, daher ist es besonders sinnlos, eine tiefe Kopie von Strings zurückzugeben. – aioobe