Java'da her zaman pass-by-value (değer ile geçiş) mekanizması kullanılır, fakat nesneler için bir özel durum vardır:
Bu nedenle, bir yöntemin içinde nesnenin alanlarını değiştirirseniz, bu orijinal nesne üzerinde etkili olur; ancak yöntem içinde değişkenin yeni bir referans ataması yapmak, orijinal nesneyi etkilemez. Bu genellikle pass-by-reference ile karıştırılır, ancak Java pass-by-reference'ı desteklemez!
Örnek:
void changePrimitive(int a) { a = 10; } void changeObject(Point p) { p.x = 10; } int num = 5; changePrimitive(num); // num hala 5 Point pt = new Point(1, 2); changeObject(pt); // şimdi pt.x == 10
Önemli! Yöntem içinde p = new Point(100, 200) ataması yapılırsa, dışarıdaki orijinal nesne değişmeyecek. Nesnenin alanı değişir, ama referansı değil!
Soru: Bir yöntemin içine gömülü nesneyi, dışarıda referans değişecek şekilde değiştirmek mümkün müdür?
Cevap: Hayır, mümkün değil. Yöntem içinde yeni bir referans atandığında, bu sadece referansın kopyasını etkiler ve yöntemden çıkıldığında kaybolur. Dışarıda, argüman değişkeni eski nesneye işaret etmeye devam eder.
void reassign(Point p) { p = new Point(100, 200); // sadece yerel! } Point pt = new Point(5, 5); reassign(pt); // pt hala (5, 5)
Hikaye
Büyük bir finansal sistemde, yöntem içinde referansı değiştirerek nesnedeki değişiklikleri "geri döndüren" bir API uygulanmıştı. Sonuçta yöntemden çıkınca değişiklikler yansımadı. Mutasyon ile yeni nesneleri geri döndürmeyi net bir şekilde ayırmak için mantığın bir kısmının tamamen yeniden tasarlanması gerekti.
Hikaye
Java'da iki nesne için swap gerçekleştirmeye çalışırken bir geliştirici, referansları geçirip bunları yöntem içinde yer değiştirerek çalıştırmaya çalıştı. Bu başarılı olmadı. Sonuç döndürmek ya da konteyner dizileri kullanmak gerekiyordu. Pass-by-value bilgisizliği nesnelerin yanlış bir şekilde değiştirilmesine yol açtı.
Hikaye
Proje katılımcılarından biri, mantığı C++'dan Java'ya taşırken pass-by-reference bekliyordu. Sonuçta yöntemlerin işleyişi düzgün olmadı: yöntemdeki değişiklikler dışarıya "çıkmadı". Kritik kod parçalarını acil olarak yeniden yazmak gerekti, bu da önemli bir zaman aldı.