2016-04-25 7 views
1

Ist es möglich, das Standardverhalten meines Java-Projekts (oder einer Teilmenge davon) zu setzen, um Kopien meiner Objekte zu erstellen, wenn ich sie in Methoden oder Funktionen übergebe?Für Pass-By-Value-Verhalten in Java-Funktionsaufrufen auswählen

Der Grund für dieses Verhalten ist, dass ich eine Reihe von Tests schreibe, die überprüfen, dass zwei Funktionen die gleiche Rendite produzieren. Wenn ich ObjectA übergebe (wo eine Eigenschaftszählung auf 3 initialisiert wird), um decrementCount() zu funktionieren, als wenn es das Objekt zurückgibt, sehe ich (ObjectA.count -> 2), während nach dem Aufruf der zweiten Funktion das Objekt jetzt (ObjectA.count -> 1) ist.

Ich möchte Pass-by-Value lieber als Pass-by-Referenz erreichen.

+0

http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value?rq=1 – rkosegi

+1

Sie können Objekte https://github.com tiefkopieren/kostaskougios/cloning – rkosegi

Antwort

3

Ist es möglich, das Standardverhalten meines Java-Projekts (oder einer Teilmenge davon) einzustellen, um Kopien meiner Objekte zu erstellen, wenn ich sie in Methoden oder Funktionen übergebe?

Nein, Java wird nur als Wert übergeben. Java-Variablen können nur Primitive und Referenzen sein. Sie können keine Objekte sein, und Sie können nicht erzwingen, dass diese kopiert werden (ohne sie explizit zu kopieren).

Wenn ich in ObjectA geben (wo eine Eigenschaft Zahl auf 3 initialisiert wird) decrementCount funktionieren(), als wenn sie das Objekt zurückgibt werde ich sehen (ObjectA.count -> 2), während nach der zweiten Aufruf der Funktion Das Objekt ist jetzt (ObjectA.count -> 1).

Ich empfehle Ihnen, das Objekt für jeden Test neu zu erstellen. Und wenn Sie Änderungen verhindern möchten, können Sie testen, dass sie nicht geändert wurden.

Ich möchte eher Pass-by-Wert als Pass-by-Referenz erreichen.

Dies ist in der Tat Ihre einzige Option. Die Kopie des Werts in der Referenz ist jedoch keine tiefe Kopie.

+0

Wenn ich richtig verstehe, sagst du, dass Java pass-by-value ist. Wenn ich jedoch an "pass-by-value" denke, denke ich an das Kopieren. In diesem Fall wird die Referenz selbst kopiert. Das ist also nicht die Art von Kopie, die ich in meiner ersten Frage angedeutet habe? –

+1

Java übergibt * Referenzen * nach Wert, nicht die Objekte, auf die sie verweisen. Es ist eine subtile Unterscheidung, ich weiß. –

+0

@ user5797668 Ja, es ist ein häufiges Missverständnis, dass, wenn Sie 'String s' schreiben, dass' s' ein String-Objekt ist, ist es nicht. 's' ist ein Verweis auf einen String und wenn Sie ihn zuweisen oder kopieren, kopieren Sie nur diesen Verweis. Wenn Sie 's == t 'tun, vergleichen Sie Referenzen, nicht ihre Inhalte. Wenn Sie 's = null;' Sie die Zeichenfolge nicht zerstören, setzen Sie einen Verweis auf 'null'. Es gibt kein spezielles Symbol in Java, das besagt, dass es sich um eine Referenz handelt, da es keine andere Option gibt. –