ProgramlamaJava Geliştirici

Java'da varargs (değişken uzunlukta argümanlar) nedir, nasıl çalışır ve kullanımında hangi tuzaklar vardır?

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

Cevap

Varargs, bir metoda belirli bir türden değişken sayıda argüman almasını sağlayan sözdizimidir. Üç nokta ile bildirilir:

public void printNames(String... names) { for (String name : names) { System.out.println(name); } }

Nasıl çalışır?

Varargs parametresi, method içinde aslında belirli türden bir dizi: yukarıdaki örnekte String[] names. Metodu herhangi bir sayıda argüman veya bir dizi ile çağırabilirsiniz:

printNames("Igor", "Anna", "Maria"); printNames(new String[] {"Alex", "Inna"});

Kullanım incelikleri:

  • Varargs, metodun parametre listesinde son parametre olmalıdır.
  • Bir metod içinde yalnızca bir varargs parametresine izin verilir.
  • Dizi ve varargs arasında aşırı yükleme varsa veya farklı türlerde varargs varsa, çağrıda belirsizlik oluşabilir.
  • Varargs'a null geçirildiğinde, metod null alır, boş bir dizi değil!

Tuzaklı Soru

Soru: Parametre olarak argüman geçmeden bu metodu çağırırsanız, varargs parametresinin dizisinin uzunluğu ne olur?

Cevap: Bu durumda varargs değişkeni, sıfır uzunluğunda bir diziye referans olacaktır: new String[0]. Null olmayacak!

public void foo(Integer... args) { System.out.println(args.length); } // foo(); // Çıktı: 0

Konuyla ilgili bilgi eksikliğinden kaynaklanan gerçek hata örnekleri


Hikaye

Kayıt kütüphanesinde log(String... messages) adında bir metod vardı. log(null) şeklinde çağrıldığında metod içinde NullPointerException meydana geldi (messages'ın boş bir dizi olması bekleniyordu, aslında null oldu). Çözüm olarak null'ı açıkça kontrol etmek zorunda kaldık.


Hikaye

Geliştirici bir aşırı yükleme oluşturdu:

public void doSomething(String[] arr) {...} public void doSomething(String... arr) {...}

Dizi geçirildiğinde, beklenen metod çağrılmadı ve bu da veri kaybına yol açtı. Dizi ve varargs arasındaki fark açık olmadı.


Hikaye

Projeye varargs'tan sonra ikinci bir parametre eklendi:

public void foo(String... args, int count) {...} // Derleme hatası!

Bu, varargs'ın son olmasi gerektiğinden hataya ve derleme hatasına yol açtı.