ProgramlamaBackend Java geliştirici

Java'da varargs (değişken uzunlukta argümanlar) nedir, dahili uygulanması nasıl çalışır ve kullanırken hangi nüanslar ve kısıtlamalar vardır?

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

Cevap

Varargs — bir metodun aynı türden değişken (herhangi bir) sayıda argümanı almasını sağlayan özel bir sözdizimidir. Metodun tanımında bu parametre Type... name şeklinde belirtilir (örneğin, int... nums). Metod içinde argümanlar normal bir dizi olarak algılanır.

Örnek:

public void printNumbers(int... nums) { for (int n : nums) { System.out.print(n + " "); } }

Çağrılar şu şekilde yapılabilir:

printNumbers(1, 2, 3, 4); // veya printNumbers();

Dahili uygulama: varargs ile bir metod çağrıldığında, derleyici otomatik olarak ilgili türde bir dizi oluşturur.

Kısıtlamalar ve incelikler:

  • Varargs parametresi yalnızca bir tane olabilir ve her zaman parametrelerin sonunda yer almalıdır.
  • Varargs genişlemesi (Type...) aslında bir dizidir (Type[]).
  • Null geçişi: printNumbers(null) çağrısı, döngü sırasında NPE meydana getirecektir.
  • Varargs ile metod aşırı yüklenmesi çağrıların belirsizliğine yol açabilir.

Aldatmacalı soru

Soru: "Birden fazla varargs parametresi ile metod tanımlanabilir mi?"

Sık yapılan hata: Birçok kişi public void example(int... a, String... b) tanımlanabileceğini düşünür, ancak bu derleme hatası alacaktır.

Doğru cevap: Hayır, yalnızca bir varargs parametresi olabilir ve bu sonuncusu olmalıdır.

Konunun inceliklerinden ötürü gerçek hata örnekleri


Hikaye

Kurumsal bir günlük kütüphanesinde, varargs ve diziler ile aşırı yüklenmiş yöntemler uygulandı. Bir dizi geçirildiğinde, elemanlar seti yerine yanlış metod versiyonu seçildiği için dizi bir nesne olarak günlüğe kaydedildi, içeriği değil. Bu, günlük analizi sırasında karışıklığa yol açtı.


Hikaye

Entegrasyon servisinde varargs ile bir metod çağrısı null kabul etti ve NPE kontrolü yapılmadı. Elemanları dolaşma girişiminde sistem beklenmedik bir şekilde "çökmeye" başladı, çünkü en azından boş bir dizinin beklenmesi gerekiyordu.


Hikaye

Bir e-ticaret projesinde metod aşırı yüklemeleri arasında karışıklık yaşandı: send(String subject, String... emails) ve başka bir metod — send(String subject, String[] emails). Bir dizi geçirildiğinde, derleyici yanlış metodunu seçiyordu. Sonuç: e-postalar müşterilere gönderilmedi.