ProgramlamaBackend geliştirici

Java'da parametrelerin yöntemlere geçiş mekanizması (pass-by-value) nasıl çalışır ve diğer programlama dillerinden ne gibi farklılıklar gösterebilir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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:

  • Primitif türler için değer kopyalanır.
  • Nesneler için nesnenin referansının değeri kopyalanır, fakat nesne kendisi değil.

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!

Kandırmaca Soru

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)

Bu konu hakkında bilgi eksikliğinden kaynaklanan gerçek hataların örnekleri


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ı.