Parameter fungsi di Kotlin dapat memiliki nilai bawaan (default), yaitu nilai yang dipakai otomatis apabila pemanggil tidak mengirimkan argumennya. Topik ini juga membahas argumen bernama, yaitu cara memanggil fungsi dengan menyebut nama parameternya, beserta aturan campurannya dengan argumen posisional. Kedua fitur tersebut mengurangi kebutuhan menulis banyak fungsi overloading untuk kasus yang serupa.
Parameter dengan nilai bawaan#
Nilai bawaan ditulis pada deklarasi parameter dengan tanda sama dengan, misalnya jenis: String = "Reguler". Pemanggil yang tidak mengirim argumen untuk parameter tersebut memperoleh nilai bawaannya, sedangkan pemanggil yang mengirim argumen menimpanya dengan nilai baru. Parameter tanpa nilai bawaan tetap wajib diisi pada setiap pemanggilan. Program berikut memakai satu fungsi dengan dua parameter bawaan dan enam bentuk pemanggilan yang berbeda.
fun cetakTiket(nama: String, jenis: String = "Reguler", jumlah: Int = 1) {
println("$jumlah tiket $jenis atas nama $nama")
}
fun main() {
cetakTiket("Budi")
cetakTiket("Citra", "VIP")
cetakTiket("Dewi", "VIP", 3)
cetakTiket("Eka", jumlah = 4)
cetakTiket(nama = "Ali", "Reguler")
cetakTiket(jumlah = 2, nama = "Gita")
}# compiler Kotlin dan pustaka standar yang dipakai jalur ini
export PATH=/home/kal/my-project/tools/kotlinc/bin:/home/kal/my-project/tools/jdk-merged/bin:$PATH
export STDLIB=/home/kal/my-project/tools/kotlinc/lib/kotlin-stdlib.jar
# kompilasi berkas main.kt menjadi out.jar, lalu jalankan programnya
kotlinc main.kt -d out.jar && java -cp "out.jar:$STDLIB" MainKt1 tiket Reguler atas nama Budi
1 tiket VIP atas nama Citra
3 tiket VIP atas nama Dewi
4 tiket Reguler atas nama Eka
1 tiket Reguler atas nama Ali
2 tiket Reguler atas nama GitaTiga pemanggilan pertama hanya memakai argumen posisional, yaitu argumen yang dipetakan ke parameter berdasarkan urutannya. Pemanggilan cetakTiket("Budi") memperoleh "Reguler" dan 1 dari nilai bawaan, sedangkan cetakTiket("Dewi", "VIP", 3) menimpa keduanya. Tiga pemanggilan terakhir memakai argumen bernama pada posisi yang berbeda-beda, sehingga satu fungsi saja sudah mencakup enam variasi pemanggilan tanpa satu pun deklarasi tambahan.
Argumen bernama#
Argumen bernama menuliskan nama parameter secara langsung pada pemanggilan dengan bentuk nama = nilai. Apabila semua argumen ditulis secara bernama, urutannya bebas disusun, sehingga cetakTiket(jumlah = 2, nama = "Gita") sah meskipun parameter nama berada lebih dulu pada deklarasi. Argumen bernama juga memperjelas pemanggilan fungsi yang memiliki beberapa parameter bertipe sama berurutan, karena maksud setiap nilai terbaca dari namanya tanpa perlu menghitung posisi. Untuk parameter yang memiliki nilai bawaan, argumen bernama memungkinkan pengisian parameter yang letaknya jauh tanpa menulis ulang seluruh argumen sebelumnya.
Campuran argumen posisional dan bernama#
Sejak Kotlin 1.4, argumen bernama boleh ditulis setelah argumen posisional, selama parameter yang dilewati memiliki nilai bawaan. Pemanggilan cetakTiket("Eka", jumlah = 4) melewati parameter jenis melalui nilai bawaannya, lalu mengisi jumlah secara bernama. Bentuk sebaliknya juga sah, yaitu argumen posisional setelah argumen bernama, sepanjang urutan argumen tetap sesuai urutan parameter, seperti pada cetakTiket(nama = "Ali", "Reguler").
Aturan yang tersisa bersifat membatasi, yaitu setelah satu parameter dilewati dengan nilai bawaannya, seluruh argumen setelahnya wajib bernama. Berkas berikut memuat pemanggilan yang melanggar batasan itu karena "Pensil" ditulis secara posisional setelah argumen bernama yang urutannya tidak sesuai.
fun hitungBiaya(barang: String, satuan: Int = 24, harga: Int = 100) {
println("$barang: $satuan unit, harga $harga")
}
fun coba() {
hitungBiaya(harga = 240, "Pensil")
}# kompilasi berkas campur.kt untuk melihat pesan error dari compiler
kotlinc campur.kt -d campur.jarcampur.kt:6:30: error: mixing named and positional arguments is not allowed unless the order of the arguments matches the order of the parameters.
hitungBiaya(harga = 240, "Pensil")
^^^^^^^^
campur.kt:6:30: error: no value passed for parameter 'barang'.
hitungBiaya(harga = 240, "Pensil")
^^^^^^^^^Compiler menolak pemanggilan tersebut dengan dua pesan error sekaligus. Pesan pertama menyatakan bahwa campuran argumen bernama dan posisional hanya sah bila urutannya sesuai urutan parameter, sedangkan pesan kedua menyatakan bahwa parameter barang tidak menerima nilai apa pun. Perbaikannya adalah menuliskan "Pensil" lebih dulu secara posisional, atau memberi nama pada seluruh argumen sehingga urutannya bebas.
Nilai bawaan sebagai pengganti overloading#
Tanpa nilai bawaan, variasi pemanggilan yang berbeda jumlah argumennya ditangani dengan overloading, yaitu mendeklarasikan beberapa fungsi dengan nama sama tetapi daftar parameter berbeda. Java memakai pendekatan ini karena bahasanya tidak mengenal nilai bawaan parameter. Fragmen berikut menunjukkan rantai fungsi yang harus ditulis untuk meniru perilaku nilai bawaan pada fungsi cetakTiket.
fun cetakTiket(nama: String) {
cetakTiket(nama, "Reguler", 1)
}
fun cetakTiket(nama: String, jenis: String) {
cetakTiket(nama, jenis, 1)
}
fun cetakTiket(nama: String, jenis: String, jumlah: Int) {
println("$jumlah tiket $jenis atas nama $nama")
}Tiga deklarasi di atas dapat digantikan oleh satu fungsi dengan dua nilai bawaan sebagaimana fungsi cetakTiket pada bagian Parameter dengan nilai bawaan. Satu deklarasi lebih mudah dipelihara daripada rantai overload, karena perubahan perilaku cukup dilakukan pada satu tempat. Apabila fungsi dengan nilai bawaan perlu dipanggil dari Java, anotasi @JvmOverloads dapat ditambahkan agar compiler menghasilkan rantai overload tersebut secara otomatis untuk pemanggil dari Java.
Ringkasan#
- Nilai bawaan ditulis pada deklarasi parameter dan dipakai bila pemanggil tidak mengirim argumennya.
- Argumen bernama menyebut nama parameter secara langsung, memperjelas pemanggilan, dan membuat urutan argumen bebas.
- Sejak Kotlin 1.4, argumen bernama boleh dicampur dengan argumen posisional selama urutannya sesuai urutan parameter.
- Nilai bawaan menggantikan rantai overload, dan anotasi
@JvmOverloadsmenghasilkan rantai itu untuk pemanggil dari Java.
Referensi#
- Functions — Kotlin Documentation — Nilai bawaan parameter, argumen bernama, dan aturan campurannya dengan argumen posisional.
- Java interoperability — Kotlin Documentation — Anotasi @JvmOverloads untuk menghasilkan overload dari nilai bawaan parameter.