Kotlin mengganti konstruksi switch dari bahasa turunan C dengan when yang lebih fleksibel dan ekspresif. Konstruksi when mencocokkan satu subjek terhadap serangkaian cabang, dan setiap cabang dapat memuat banyak nilai sekaligus. Sama seperti if, when dapat berfungsi sebagai statement atau expression yang menghasilkan nilai. Pada chapter ini kita akan membentuk when sederhana, when expression yang wajib menyertakan else, dan when tanpa argumen sebagai pengganti rantai else if.

Bentuk Statement: Pencocokan Sederhana #

Bentuk statement hanya mengeksekusi cabang yang cocok tanpa mengembalikan nilai. Sintaks when (subjek) { nilai -> aksi } mirip dengan switch case, tetapi tanpa perlu break karena cabang lain tidak ikut dieksekusi.

kotlin
fun main() {
    val hari = 3

    // Bentuk statement: hanya mengeksekusi branch yang cocok
    when (hari) {
        1 -> println("Senin")
        2 -> println("Selasa")
        3 -> println("Rabu")
        4 -> println("Kamis")
        5 -> println("Jumat")
        6, 7 -> println("Akhir pekan")
        else -> println("Nomor hari tidak valid")
    }

    // Bentuk expression: wajib ada else, menghasilkan nilai
    val kode = 404
    val keterangan = when (kode) {
        200 -> "OK"
        301 -> "Moved Permanently"
        404 -> "Not Found"
        500 -> "Internal Server Error"
        else -> "Kode tidak dikenal"
    }
    println("HTTP $kode -> $keterangan")

    // Banyak nilai dalam satu branch dipisah koma
    val bulan = 7
    val musim = when (bulan) {
        12, 1, 2 -> "Musim Hujan"
        3, 4, 5 -> "Musim Pancaroba Awal"
        6, 7, 8 -> "Musim Kemarau"
        9, 10, 11 -> "Musim Pancaroba Akhir"
        else -> "Bulan tidak valid"
    }
    println("Bulan $bulan -> $musim")

    // when tanpa argumen: sebagai pengganti rantai if-else-if
    val x = 15
    when {
        x < 0 -> println("$x negatif")
        x == 0 -> println("$x nol")
        x < 10 -> println("$x satu digit")
        else -> println("$x dua digit")
    }
}

Output yang Dihasilkan:

text
Rabu
HTTP 404 -> Not Found
Bulan 7 -> Musim Kemarau
15 dua digit

Mari kita bedah setiap bagian penting pada contoh di atas:

  1. when (hari) { 1 -> ...; 6, 7 -> ...; else -> ... }: subjek hari dicocokkan terhadap setiap nilai. Untuk 6, 7, kedua angka dipisah koma berbagi satu cabang. else menangani nilai di luar daftar.
  2. val keterangan = when (kode) { ... else -> "Kode tidak dikenal" }: sebagai expression, kompilator memerlukan else agar semua nilai subjek tercakup dan tipe hasil menjadi String.
  3. when (bulan) { 12, 1, 2 -> "Musim Hujan" ... }: satu cabang dapat memuat banyak nilai, sangat berguna untuk pengelompokan musim berdasarkan bulan.
  4. when { x < 0 -> ...; else -> ... }: bentuk tanpa argumen. Setiap cabang berupa ekspresi boolean; cabang pertama yang true dieksekusi. Ini adalah alternatif else if yang lebih rapi.

Bentuk Expression Wajib else #

Ketika when digunakan sebagai expression yang mengembalikan nilai, kompilator mensyaratkan adanya else atau cabang yang menutup semua kemungkinan subjek. Tanpa else, kode gagal kompilasi untuk tipe terbuka seperti Int atau Any.

when Tanpa Argumen #

Bentuk when { ... } tanpa argumen adalah pengganti yang lebih bersih untuk rantai else if yang panjang. Setiap cabang berupa ekspresi boolean yang dievaluasi berurutan; cabang pertama yang true menentukan hasil.

PolaCocok untuk
when (x) { 1 -> ...; 2 -> ...; else -> ... }pencocokan nilai spesifik
when (x) { 1, 2, 3 -> ...; else -> ... }pengelompokan banyak nilai
when { kond1 -> ...; kond2 -> ...; else -> ... }rantai kondisi heterogen

Perbandingan dengan switch #

when menghilangkan beberapa kelemahan klasik switch di Java: tidak perlu break di setiap case, satu cabang dapat memuat banyak nilai, dan cabang dapat berupa ekspresi (mis. range atau type check) yang akan kita bahas pada chapter when-dengan-range dan when-dengan-type-checking.

Referensi Lanjutan #

  • Control flow — panduan resmi when expression sebagai pengganti switch

Setelah memahami dasar when, chapter berikutnya akan memperluas kemampuan pencocokan dengan range menggunakan operator in.