Menu

Varargs Java: Method yang Menerima Argumen Berapa Pun

Cara varargs (...) di Java membuat method menerima argumen berapa pun jumlahnya, bagaimana varargs menjadi array, aturan satu varargs di akhir, serta jebakan panggilan kosong dan ambiguitas.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Satu Method, Argumen Berapa Pun

Kadang kamu tidak tahu sejak awal berapa argumen yang dibutuhkan sebuah method. Mungkin suatu saat kamu ingin max(3, 9), lalu di saat lain max(1, 7, 4, 2, 8). Tanpa varargs, kamu harus menulis overload untuk setiap jumlah argumen atau memaksa pemanggil membuat array. Varargs, singkatan dari variable arguments, membuat satu method bisa menerima nol, satu, atau banyak nilai dengan tipe yang sama.

Kamu mendeklarasikannya dengan menaruh tiga titik (...) setelah tipe parameternya:

Pemanggil mengirim nilai-nilai lepas; di dalam method, numbers adalah array sungguhan. Itulah seluruh idenya: compiler membungkus argumen-argumen itu ke dalam array untukmu.

Varargs Hanyalah Array

Tidak ada sihir saat runtime. Parameter yang dideklarasikan int... numbers persis sama dengan int[] begitu kamu berada di dalam method. Kamu bisa menanyakan length-nya, mengakses indeksnya, dan melakukan loop padanya seperti array lainnya.

Karena memang benar-benar array, kamu juga bisa memberikan array yang sudah kamu punya ke method varargs. Method itu menerima kedua bentuk:

Aturannya: Terakhir dan Hanya Satu

Dua aturan menjaga varargs tetap tidak ambigu, dan compiler menegakkan keduanya:

  1. Parameter varargs harus berada di urutan terakhir. Parameter biasa ditulis lebih dulu, lalu parameter ... menampung sisanya.
  2. Sebuah method maksimal punya satu parameter varargs. Kalau ada dua, mustahil menentukan di mana yang satu berakhir dan yang berikutnya dimulai.

Kode ini berhasil di-compile. Tapi menaruh varargs di depan, misalnya static void log(Object... values, String level), adalah error kompilasi: varargs parameter must be the last. Parameter wajib level selalu ditulis sebelum ....

Tempat Kamu Sudah Memakai Varargs

Sebenarnya kamu sudah memanggil method varargs selama ini. System.out.printf dan String.format adalah contoh klasiknya: parameter keduanya adalah Object... args:

List.of(...), Arrays.asList(...), dan banyak API bergaya builder juga memakai varargs. Itulah sebabnya kamu bisa memberikan elemen berapa pun ke method-method itu tanpa harus membungkusnya sendiri ke dalam array.

Varargs dan Overloading

Varargs dan overloading saling berinteraksi dengan satu cara yang mengejutkan. Kalau overload biasa dan overload varargs sama-sama cocok dengan sebuah panggilan, Java memilih yang lebih spesifik, yaitu method dengan jumlah parameter tetap yang menang:

pick(1, 2) cocok dengan keduanya, tetapi Java memilih overload yang bukan varargs karena paling pas. Method varargs hanya berjalan kalau tidak ada overload tetap yang cocok. Biasanya memang itu yang kamu mau, tetapi artinya menambahkan overload varargs bisa diam-diam mengubah method mana yang dipilih untuk sebuah panggilan.

Hati-hati dengan Panggilan Kosong dan null

Ada dua jebakan yang sering menjebak orang. Pertama, memanggil method varargs tanpa argumen memberi method itu array kosong, bukan null, jadi numbers.length bernilai 0 dan loop tidak melakukan apa-apa. Kamu tidak perlu mengecek null untuk kasus tanpa argumen:

Kedua, mengirim literal null itu ambigu dan berbahaya: Java bisa menafsirkan count(null) sebagai "seluruh array varargs bernilai null", bukan "satu elemen null", yang lalu melempar NullPointerException saat kamu membaca length-nya. Kalau kamu memang bermaksud mengirim satu elemen null, tulis secara eksplisit dengan count((Object) null).

Berikutnya: Class

Varargs melengkapi apa yang bisa kamu lakukan dengan parameter method: daftar argumen yang fleksibel di atas overloading. Sejauh ini method-method kita hidup lepas di dalam class dengan static. Berikutnya kamu akan melihat cara class bekerja yang sebenarnya: menggabungkan data (field) dan perilaku (method) ke dalam tipe buatanmu sendiri, yang menjadi inti dari Java berorientasi objek.

Pertanyaan yang sering diajukan

Apa itu varargs di Java?

Varargs (variable arguments) membuat method bisa menerima argumen dengan tipe yang sama berapa pun jumlahnya. Kamu mendeklarasikannya dengan menaruh ... setelah tipenya: int sum(int... numbers). Pemanggil bisa mengirim nol, satu, atau banyak nilai, dan di dalam method numbers adalah array biasa. Ini sekadar syntactic sugar: Java mengumpulkan argumen-argumen lepas itu ke dalam array untukmu.

Bisakah method Java punya lebih dari satu parameter varargs?

Tidak. Sebuah method maksimal punya satu parameter varargs, dan parameter itu harus berada di urutan terakhir dalam daftar parameter, misalnya void log(String level, Object... values). Kalau tidak di akhir, Java tidak akan tahu di mana bagian yang panjangnya bervariasi berakhir dan parameter berikutnya dimulai. Parameter biasa selalu ditulis sebelum parameter ....

Apa perbedaan varargs dan parameter array di Java?

Saat runtime keduanya hampir sama: parameter varargs int... adalah int[] di dalam method. Bedanya ada di tempat pemanggilan: dengan varargs kamu menulis sum(1, 2, 3) (nilai lepas), sedangkan dengan parameter array eksplisit kamu harus membuat dan mengirim array, sum(new int[]{1, 2, 3}). Method varargs juga menerima array secara langsung, jadi varargs adalah pilihan yang lebih fleksibel.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai