Percabangan if menentukan langkah program berdasarkan sebuah kondisi bertipe Boolean. Pada Kotlin, if memiliki peran ganda, yaitu pernyataan yang mengatur alur eksekusi sekaligus ekspresi yang menghasilkan nilai. Topik ini membahas kedua peran tersebut, rantai else if untuk banyak pilihan, serta alasan Kotlin tidak menyediakan operator ternary. Setelah membacanya, percabangan yang menghasilkan nilai dapat ditulis tanpa variabel sementara yang tidak perlu.
if sebagai pernyataan#
Pernyataan if mengeksekusi satu blok kode apabila kondisinya bernilai true, dan tidak melakukan apa pun apabila kondisinya bernilai false. Bentuk ini dipakai ketika yang dibutuhkan hanyalah efek samping, misalnya menampilkan pesan atau mengubah isi variabel, tanpa ada nilai yang perlu dihasilkan. Kondisi pada if wajib bertipe Boolean. Tidak ada konversi otomatis dari angka atau teks ke Boolean, sehingga kebiasaan dari bahasa lain yang memperlakukan nilai bukan nol sebagai benar harus ditinggalkan.
Bentuk paling sederhananya hanya memiliki satu cabang.
// tidak-dijalankan
if (suhu > 30) {
println("Udara sedang panas")
}Apabila nilai suhu lebih besar dari 30, pesan ditampilkan. Apabila tidak, blok tersebut dilewati dan program berlanjut ke baris berikutnya. Kurung kurawal boleh dihilangkan untuk satu pernyataan, tetapi membiarkannya terpasang membuat blok aman ketika pernyataan kedua ditambahkan kemudian. Cabang else tidak wajib ada pada bentuk pernyataan karena tidak ada nilai yang ditunggu dari ekspresinya. Ketiadaan cabang berarti pilihan ketika kondisi false memang tidak melakukan apa pun, dan pola ini lazim untuk pemeriksaan bersyarat semacam pemberitahuan.
if sebagai ekspresi#
Ekspresi adalah kode yang menghasilkan nilai, dan if pada Kotlin memenuhi definisi itu. Hasil cabang yang terpilih dapat langsung disimpan ke dalam variabel atau dikembalikan oleh fungsi.
// tidak-dijalankan
val a = 24
val b = 10
val maksimum = if (a > b) a else bVariabel maksimum memperoleh nilai a apabila a lebih besar dari b, dan memperoleh nilai b untuk kasus sebaliknya. Tidak ada baris penugasan di dalam cabang karena cabangnya sendiri sudah berupa nilai. Ketika if dipakai sebagai ekspresi, cabang else menjadi wajib. Tanpa else, tidak ada nilai yang bisa dihasilkan ketika kondisi bernilai false, sehingga compiler menolak program tersebut.
Kedua cabang tidak harus berisi tipe yang sama persis, tetapi compiler menyatukan tipe keduanya, dan tipe gabungan itulah yang menjadi hasil ekspresi. Praktik yang aman adalah menyamakan tipe kedua cabang, misalnya keduanya String atau keduanya Int, agar hasilnya langsung dapat dipakai tanpa pemeriksaan tipe tambahan.
Rantai else if untuk banyak pilihan#
Ketika satu kondisi tidak cukup, cabang else if dapat dirantai sebanyak yang diperlukan, dan else tanpa kondisi menutup rantai sebagai pilihan terakhir. Kondisi diperiksa dari atas ke bawah, dan cabang pertama yang kondisinya bernilai true menghasilkan nilai. Cabang setelahnya tidak dieksekusi lagi, sehingga urutan penulisan kondisi ikut menentukan hasil.
Program berikut mengonversi nilai ujian menjadi predikat. Konversi seperti ini adalah pemakaian khas rantai else if karena setiap rentang nilai perlu diperiksa secara berurutan.
fun main() {
val nilai = 78
val predikat = if (nilai >= 85) {
"A"
} else if (nilai >= 70) {
"B"
} else if (nilai >= 60) {
"C"
} else {
"D"
}
println("Nilai $nilai memperoleh predikat $predikat")
val status = if (predikat == "D") "perlu bimbingan" else "sesuai target"
println("Status: $status")
}Simpan isi di atas sebagai berkas main.kt, lalu kompilasi dan jalankan dengan perintah berikut. Jalur instalasi kotlinc pada contoh mengikuti lingkungan kerja modul ini, sehingga kedua baris export perlu disesuaikan dengan lokasi instalasi pada komputer lain, atau dihilangkan bila kotlinc dan java sudah berada pada PATH.
# siapkan alat kompilasi Kotlin pada lingkungan kerja 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 main.kt menjadi out.jar, lalu jalankan kelas MainKt
kotlinc main.kt -d out.jar && java -cp "out.jar:$STDLIB" MainKtNilai 78 memperoleh predikat B
Status: sesuai targetNilai 78 terhenti pada kondisi kedua, yaitu nilai >= 70, sehingga predikatnya B dan kondisi setelahnya tidak diperiksa lagi. Ekspresi terakhir menunjukkan bentuk satu baris tanpa kurung kurawal, yang lazim dipakai untuk cabang yang pendek.
Kotlin tidak memiliki operator ternary#
Java menawarkan operator ternary berbentuk kondisi ? nilaiA : nilaiB untuk pemilihan nilai dalam satu baris. Kotlin sengaja tidak menyediakan operator tersebut karena if-else sudah menghasilkan nilai, sehingga operator tambahan hanya menambah dua cara penulisan untuk hal yang sama. Terjemahan langsungnya adalah if-else satu baris. Rantai pemilihan bersarang yang ditulis dengan ternary pada Java sering menumpuk dan sulit diurai, sedangkan rantai yang sama pada Kotlin ditulis sebagai if-else if biasa. Satu bentuk penulisan untuk satu makna juga meniadakan perbedaan gaya di dalam tim.
// tidak-dijalankan
// Java: String label = (jumlah > 10) ? "banyak" : "sedikit";
// Kotlin:
val label = if (jumlah > 10) "banyak" else "sedikit"Kedua bentuk menghasilkan kode dengan makna yang sama. Petunjuk resmi Kotlin menyarankan bentuk if-else satu baris untuk cabang yang pendek, sedangkan cabang yang panjang ditulis dengan kurung kurawal agar tetap terbaca. Konsistensi satu cara penulisan juga membuat kode lebih mudah diurai oleh pengembang yang baru berpindah bahasa.
Kesalahan umum#
Kesalahan pertama adalah memakai if sebagai ekspresi tanpa else. Penulisan val status = if (jumlah > 0) "positif" ditolak compiler karena tidak ada nilai untuk kondisi false. Perbaikannya adalah menambahkan else, atau mengubah bentuknya menjadi pernyataan biasa apabila yang dibutuhkan memang efek samping.
Kesalahan kedua adalah mencampur tipe hasil pada kedua cabang, misalnya "A" pada satu cabang dan 0 pada cabang lain. Compiler menyatukan keduanya menjadi tipe Any, yaitu induk semua tipe, sehingga pemanggilan anggota khusus String pada hasilnya memerlukan pemeriksaan tipe terlebih dahulu. Samakan tipe kedua cabang agar hasil langsung siap dipakai.
Kesalahan ketiga adalah menulis penugasan di dalam kondisi, misalnya if (nilai = 100). Pada Kotlin, penugasan bukan ekspresi, sehingga konstruksi ini error saat kompilasi. Kesalahan klasik pada Java yang menukar == dengan = tertangkap otomatis, dan perbaikannya adalah memakai == untuk perbandingan. Ketiga kesalahan tersebut tertangkap compiler pada saat kompilasi, bukan ketika program berjalan, sehingga perbaikannya murah. Membaca pesan error Kotlin dengan saksama biasanya sudah menunjukkan baris dan penyebabnya.
Ringkasan#
ifberperan sebagai pernyataan untuk mengatur langkah dan sebagai ekspresi yang menghasilkan nilai.ifyang dipakai sebagai ekspresi wajib memilikielse, dan tipe hasil kedua cabangnya disatukan oleh compiler.- Rantai
else ifmemilih cabang pertama yang kondisinya bernilaitrue, sehingga urutan kondisi menentukan hasil. - Kotlin tidak memiliki operator ternary karena
if-elsesudah menghasilkan nilai.
Referensi#
- Control flow: if, when, for, while — JetBrains
— Dokumentasi resmi perilaku
ifsebagai ekspresi, rantaielse if, dan aturan cabangnya. - Basic syntax — JetBrains
— Ringkasan sintaks dasar Kotlin yang memuat percabangan
if.