Menu

Java Varargs: İstediğiniz Sayıda Argüman Alan Metotlar

Java'nın varargs (...) yapısı bir metodun istediğiniz sayıda argüman almasını nasıl sağlar, bunlar nasıl diziye dönüşür, tek-vararg-sonda kuralı ve boş çağrı ile belirsizlik tuzakları.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Tek Metot, İstediğiniz Sayıda Argüman

Bazen bir metodun kaç argümana ihtiyaç duyacağını önceden bilmezsiniz. Bir an max(3, 9) istersiniz, bir sonraki an max(1, 7, 4, 2, 8). Varargs olmadan, her sayı için bir aşırı yükleme yazmanız ya da çağıranı bir dizi oluşturmaya zorlamanız gerekirdi. Varargs - değişken argümanların kısaltması - tek bir metodun aynı türden sıfır, bir ya da birçok değer almasını sağlar.

Bunları parametre türünden sonra üç nokta (...) koyarak tanımlarsınız:

Çağıran taraf dağınık değerler geçirir; metot içinde numbers gerçek bir dizidir. Tüm fikir budur: derleyici argümanları sizin için bir dizide paketler.

Varargs Sadece Bir Dizidir

Çalışma zamanında sihir yoktur. int... numbers olarak tanımlanan bir parametre, metot içine girdiğinizde tam olarak bir int[]'dir. Onun length değerini sorabilir, indeksleyebilir ve başka herhangi bir dizi gibi üzerinde döngü kurabilirsiniz.

Gerçekten bir dizi olduğu için, bir varargs metoduna elinizde zaten olan bir diziyi de verebilirsiniz - her iki biçimi de kabul eder:

Kurallar: Sonda ve Yalnızca Bir Tane

İki kural varargs'ı belirsizlikten uzak tutar ve derleyici ikisini de zorunlu kılar:

  1. Varargs parametresi son olmalıdır. Normal parametreler önce gelir, ardından ... parametresi geriye kalan ne varsa onu emer.
  2. Bir metotta en fazla bir varargs parametresi olabilir. İki tanesi, birinin nerede bitip diğerinin nerede başladığını anlamayı olanaksız kılardı.

Bu derlenir. Ama varargs'ı başa koymak - static void log(Object... values, String level) - bir derleme hatasıdır: varargs parameter must be the last. Zorunlu parametre level her zaman ...'tan önce gelir.

Varargs'ı Zaten Nerede Kullanıyorsunuz

Aslında baştan beri varargs metotları çağırıyorsunuz. System.out.printf ve String.format klasik örneklerdir; ikinci parametreleri Object... args'tır:

List.of(...), Arrays.asList(...) ve birçok builder tarzı API de varargs'tır. İşte bu yüzden onlara istediğiniz sayıda öğeyi, kendiniz bir diziye sarmadan geçirebilirsiniz.

Varargs ve Aşırı Yükleme

Varargs ve aşırı yükleme şaşırtıcı bir şekilde etkileşir. Normal bir aşırı yükleme ile bir varargs aşırı yüklemesi bir çağrıyla aynı anda eşleşebiliyorsa, Java daha özgül olanı tercih eder - sabit argüman sayılı metot kazanır:

pick(1, 2) her ikisiyle de eşleşir, ama Java varargs olmayan aşırı yüklemeyi seçer çünkü daha yakın bir uyum sağlar. Varargs metodu yalnızca sabit argüman sayılı hiçbir aşırı yükleme eşleşmediğinde çalışır. Bu genellikle istediğiniz şeydir, ama bir varargs aşırı yüklemesi eklemenin, bir çağrının hangi metoda çözümlendiğini sessizce değiştirebileceği anlamına gelir.

Boş ve null Çağrılara Dikkat Edin

İki tuzak insanları yakalar. Birincisi: bir varargs metodunu argümansız çağırmak, metoda null değil boş bir dizi verir; dolayısıyla numbers.length 0'dır ve döngü hiçbir şey yapmaz. Argümansız durum için null kontrolüne ihtiyacınız yoktur:

İkincisi: düz bir null geçirmek belirsiz ve tehlikelidir: Java count(null) ifadesini "bir null öğe" yerine "tüm varargs dizisi null" olarak yorumlayabilir; bu da length değerini okuduğunuzda bir NullPointerException fırlatır. Gerçekten tek bir null öğe demek istiyorsanız, count((Object) null) ile açık olun.

Sırada: Sınıflar

Varargs, metot parametreleriyle yapabileceklerinizi tamamlar - aşırı yüklemenin üzerine esnek argüman listeleri. Şimdiye kadar metotlar bir sınıf içinde static ile dağınık biçimde yaşadı. Sırada sınıfların gerçekte nasıl çalıştığını göreceksiniz: verileri (alanlar) ve davranışı (metotlar) kendi türlerinizde bir araya getirmek - ki bu nesne yönelimli Java'nın kalbidir.

Sıkça Sorulan Sorular

Java'da varargs nedir?

Varargs (değişken argümanlar) bir metodun aynı türden istediğiniz sayıda argüman almasını sağlar. Türden sonra ... koyarak tanımlarsınız: int sum(int... numbers). Çağıran taraf sıfır, bir ya da birçok değer geçirebilir ve metot içinde numbers sıradan bir dizidir. Bu sözdizimsel bir kolaylıktır; Java dağınık argümanları sizin için bir diziye toplar.

Bir Java metodu birden fazla varargs parametresine sahip olabilir mi?

Hayır. Bir metotta en fazla bir varargs parametresi olabilir ve bu, parametre listesindeki son parametre olmalıdır - örneğin void log(String level, Object... values). Son olmasaydı, Java değişken uzunluktaki kısmın nerede bittiğini ve sonraki parametrenin nerede başladığını bilemezdi. Normal parametreler her zaman ... parametresinden önce gelir.

Java'da varargs ile dizi parametresi arasındaki fark nedir?

Çalışma zamanında neredeyse aynıdırlar - bir varargs parametresi int..., metot içinde bir int[]'dir. Fark çağrı noktasındadır: varargs ile sum(1, 2, 3) (dağınık değerler) yazarsınız; açık bir dizi parametresiyle ise bir dizi oluşturup geçirmeniz gerekir, sum(new int[]{1, 2, 3}). Bir varargs metodu doğrudan bir diziyi de kabul eder, bu yüzden daha esnek seçimdir.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA