In Java wird immer der Mechanismus pass-by-value (Übergabe nach Wert) verwendet, aber es gibt eine Besonderheit für Objekte:
Deshalb beeinflusst die Änderung der Felder eines Objekts innerhalb der Methode das ursprüngliche Objekt, während der Versuch, innerhalb der Methode eine neue Referenz der Variablen zuzuweisen, keinen Einfluss auf das ursprüngliche Objekt hat. Dies wird oft mit pass-by-reference verwechselt, jedoch unterstützt Java kein pass-by-reference!
Beispiel:
void changePrimitive(int a) { a = 10; } void changeObject(Point p) { p.x = 10; } int num = 5; changePrimitive(num); // num bleibt 5 Point pt = new Point(1, 2); changeObject(pt); // jetzt ist pt.x == 10
Wichtig! Wenn innerhalb der Methode p = new Point(100, 200) zugewiesen wird, ändert sich das ursprüngliche Objekt außerhalb der Methode nicht. Es ändert sich das Feld des Objekts, nicht dessen Referenz!
Frage: Kann man ein Objekt, das als Argument übergeben wird, innerhalb der Methode so ändern, dass die Referenzvariable außerhalb der Methode auf ein neues Objekt zeigt?
Antwort: Nein, das ist nicht möglich. Bei der Zuweisung einer neuen Referenz zu einem Argument innerhalb der Methode betrifft dies nur die Kopie der Referenz, die nach dem Verlassen der Methode verschwindet. Außerhalb der Methode zeigt die Argumentvariable auf das ursprüngliche Objekt.
void reassign(Point p) { p = new Point(100, 200); // nur lokal! } Point pt = new Point(5, 5); reassign(pt); // pt ist immer noch (5, 5)
Geschichte
In einem großen Finanzsystem wurde eine API implementiert, die Änderungen am Objekt "zurückgab", indem sie die Referenz innerhalb der Methode modifizierte. Infolgedessen spiegelten sich die Änderungen nach dem Verlassen der Methode nicht wider. Es war notwendig, einen Teil der Logik vollständig neu zu konzipieren, um Mutation und die Rückgabe neuer Objekte klar zu trennen.
Geschichte
Bei dem Versuch, einen Swap für zwei Objekte in Java mit der Methode
swap(A a, B b)zu implementieren, übergab der Entwickler Referenzen und tauschte sie innerhalb der Methode aus. Das funktionierte nicht. Es ist notwendig, entweder das Ergebnis zurückzugeben oder Container-Arrays zu verwenden. Unkenntnis von pass-by-value führte zu einem fehlerhaften Austausch von Objekten.
Geschichte
Einer der Projektteilnehmer migrierte die Logik von C++ und erwartete das Verhalten von pass-by-reference. Infolgedessen funktionierten die Methoden nicht richtig: Änderungen in der Methode "kamen" nicht nach außen. Es war dringend notwendig, kritische Stellen im Code neu zu schreiben, was viel Zeit in Anspruch nahm.