In Java wordt altijd het mechanisme pass-by-value (doorgeven per waarde) gebruikt, maar er is een bijzonderheid voor objecten:
Daarom heeft het wijzigen van de velden van een object binnen een methode invloed op het originele object, maar een poging om binnen de methode een nieuwe referentie aan de variabele toe te wijzen, heeft geen invloed op het oorspronkelijke object. Dit wordt vaak verward met pass-by-reference, maar Java ondersteunt geen pass-by-reference!
Voorbeeld:
void changePrimitive(int a) { a = 10; } void changeObject(Point p) { p.x = 10; } int num = 5; changePrimitive(num); // num blijft 5 Point pt = new Point(1, 2); changeObject(pt); // nu is pt.x == 10
Belangrijk! Als je binnen de methode p = new Point(100, 200) toewijst, verandert het oorspronkelijke object buiten de methode niet. Het veld van het object verandert, niet de referentie!
Vraag: Kun je vanuit een methode het object dat als argument is doorgegeven, wijzigen, zodat de referentievariabele buiten de methode naar een nieuw object wijst?
Antwoord: Nee, dat kan niet. Bij het toewijzen van een nieuwe referentie aan het argument binnen de methode, raakt dit alleen de kopie van de referentie, die verdwijnt na het verlaten van de methode. Buiten de methode wijst de argumentvariabele nog steeds naar het oude object.
void reassign(Point p) { p = new Point(100, 200); // alleen lokaal! } Point pt = new Point(5, 5); reassign(pt); // pt is nog steeds (5, 5)
Verhaal
In een groot financieel systeem werd een API geïmplementeerd die wijzigingen in een object "teruggaf" door de referentie binnen de methode te modificeren. Als gevolg hiervan werden de wijzigingen na het verlaten van de methode niet weerspiegeld. Het was nodig om een groot deel van de logica volledig opnieuw te ontwerpen om de mutatie en de teruggaaf van nieuwe objecten duidelijk te scheiden.
Verhaal
Bij de poging om een swap voor twee objecten in Java te implementeren met de methode
swap(A a, B b)gaf de ontwikkelaar referenties door en verwisselde deze binnen de methode. Dit werkte niet. Het was noodzakelijk om het resultaat terug te geven of containerarrays te gebruiken. Onwetendheid over pass-by-value leidde tot een onjuiste uitwisseling van objecten.
Verhaal
Een van de projectleden migreerde de logica van C++ en verwachtte het gedrag van pass-by-reference. Als gevolg hiervan werkten de methoden niet correct: wijzigingen binnen de methode kwamen niet "buiten". Het was dringend nodig om kritieke delen van de code opnieuw te schrijven, wat veel tijd in beslag nam.