Best Practice für wiederkehrende Objektreferenzen

8

Betrachten Sie dieses Code-Snippet:

%Vor%

Da Java Objektreferenzen nach Wert übergibt, verstehe ich, dass jedes Objekt, das getList() aufruft, einen Verweis auf myList erhält, wodurch es myList ändern kann, obwohl es private ist. Ist das richtig?

Und wenn es richtig ist, sollte ich

verwenden %Vor%

zum Erstellen einer Kopie und zum Zurückgeben eines Verweises auf die Kopie anstelle des Originals, um unbefugten Zugriff auf die Liste zu verhindern, auf die von myList ?

verwiesen wird?     
chrisbunney 11.07.2010, 21:15
quelle

5 Antworten

9

Ich mache das. Besser noch, manchmal gebe ich eine nicht änderbare Kopie mit dem Collections API zurück.

Wenn Sie das nicht tun, ist Ihre Referenz nicht privat. Jeder, der eine Referenz hat, kann Ihren privaten Status ändern. Gleiches gilt für jede veränderbare Referenz (z. B. Datum).

    
duffymo 11.07.2010, 21:18
quelle
2

Es hängt davon ab, was Sie wollen.

Möchten Sie die Liste verfügbar machen und so einrichten, dass die Benutzer sie bearbeiten können?

Oder möchten Sie, dass die Leute es sehen, aber nicht ändern?

In diesem Fall gibt es keinen richtigen oder falschen Weg. Es hängt nur von Ihren Designanforderungen ab.

    
jjnguy 11.07.2010 21:18
quelle
1

Es kann Fälle geben, in denen die "rohe" Liste an den Aufrufer zurückgegeben werden soll. Aber im Allgemeinen denke ich, dass es eine schlechte Übung ist, da es die Kapselung bricht und daher gegen OO ist. Wenn Sie die "rohe" Liste und nicht eine Kopie zurückgeben müssen, sollte dies den Benutzern von MyClass explizit klar sein.

    
Cratylus 11.07.2010 21:34
quelle
1

Ich denke, dass das Muster, Felder privat zu machen und Accessoren bereitzustellen, einfach für die Datenkapselung gedacht ist. Wenn Sie möchten, dass etwas wirklich privat ist, geben Sie es nicht Accessormethoden! Sie können dann andere Methoden schreiben, die unveränderliche Versionen Ihrer privaten Daten oder Kopien davon zurückgeben.

    
Jesse 12.07.2010 01:09
quelle
0

Ja, und es hat einen Namen .. "Defensive Kopie". Das Kopieren auf der Empfängerseite wird ebenfalls empfohlen. Als Tom hat festgestellt , ist das Verhalten des Programms viel einfacher um vorherzusagen, ob die Sammlung unveränderlich ist. Wenn Sie also keinen sehr guten Grund haben, sollten Sie eine unveränderbare Sammlung verwenden.

Wenn Google Guava Teil der Java-Standardbibliothek wird (ich denke, das sollte es sein), wäre das der Fall wahrscheinlich das bevorzugte Idiom:

%Vor%

und

%Vor%

Dies hat einen zusätzlichen Leistungserfolg, weil die Methode copyOf() prüft, ob die Sammlung bereits eine Instanz der unveränderlichen Sammlung ist ( instanceof ImmutableList ), und wenn ja, überspringt das Kopieren.

    
Enno Shioji 11.07.2010 23:37
quelle

Tags und Links