Menu

Pernyataan switch Java: Case, Fall-Through, dan Sintaks Arrow

Penjelasan pernyataan switch di Java: label case, break dan fall-through, cabang default, mengelompokkan case, bentuk arrow modern, dan switch expression.

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

Kegunaan switch

switch membandingkan satu nilai dengan daftar pilihan yang tetap, lalu menjalankan cabang yang cocok. Kalau kamu mendapati dirimu menulis rantai if/else if panjang yang terus menguji variabel yang sama dengan konstanta yang berbeda-beda, switch menyampaikan hal yang sama dengan lebih jelas.

Pernyataan ini hanya melakukan pengecekan kesamaan dengan konstanta yang sudah diketahui saat kompilasi, dan tidak bisa menguji rentang atau menggabungkan kondisi. Untuk itu, tetap pakai if/else.

Pernyataan switch Klasik

Bentuk tradisionalnya memakai label case dengan titik dua dan break setelah setiap cabang:

Java mengevaluasi day, melompat ke case yang cocok, menjalankan pernyataannya, lalu break keluar dari switch. Cabang default berjalan kalau tidak ada yang cocok, anggap saja sebagai else-nya. Cabang ini opsional, tetapi sebaiknya ditulis supaya nilai yang tidak terduga tidak lolos diam-diam.

Jebakan break: Fall-Through

Inilah bug switch yang paling umum. Kalau kamu tidak menulis break, eksekusi tidak berhenti di akhir case yang cocok, melainkan mengalir (fall through) ke case berikutnya dan terus berjalan sampai menemukan break atau kurung kurawal penutup:

Kamu mungkin mengira hasilnya hanya Level 1, tetapi kode ini mencetak ketiga baris. Karena case 1 tidak punya break, alur program langsung meluncur ke case 2 dan case 3. Selalu tambahkan break kecuali kamu memang ingin fall-through, dan kalau kamu memang mengandalkannya, tulis komentar supaya pembaca berikutnya tahu itu disengaja.

Mengelompokkan Case

Fall-through punya satu kegunaan yang sah dan rapi: menumpuk label case supaya beberapa nilai berbagi satu blok. Tulis label-labelnya berurutan tanpa kode di antaranya:

Di sini 'A', 'B', dan 'C' semuanya menjalankan baris "Pass" yang sama. Inilah cara yang dimaksudkan untuk menyatakan "nilai mana pun dari ini melakukan hal yang sama".

switch pada String

Kamu tidak terbatas pada angka. Sejak Java 7 kamu bisa memakai switch pada String, yang sangat cocok untuk pilihan menu atau nama perintah:

Pencocokannya membedakan huruf besar dan kecil: "Stop" tidak akan cocok dengan "stop", jadi seragamkan dulu (misalnya command.toLowerCase()) kalau penulisan input-nya bisa berbeda-beda. Satu jebakan lagi: kalau command bernilai null, switch akan melempar NullPointerException, jadi lindungi dari null sebelum sampai ke sana.

Sintaks Arrow Modern

Java yang lebih baru (14+) menambahkan bentuk arrow, case label -> ..., yang memang dirancang untuk menghilangkan jebakan fall-through. Setiap case arrow menjalankan tepat satu cabang dan tidak pernah fall through, jadi tidak ada break yang bisa terlupa:

Perhatikan bahwa kamu mengelompokkan nilai dengan koma (case 6, 7) alih-alih menumpuk label, dan tidak ada satu pun break. Untuk beberapa pernyataan, pakai blok: case 1 -> { ...; ... }. Utamakan bentuk ini di kode baru, karena lebih pendek dan menghilangkan satu jenis bug sekaligus.

switch sebagai Expression

Bentuk arrow juga bisa menghasilkan nilai. Switch expression mengembalikan hasil yang bisa langsung kamu simpan ke variabel, tanpa variabel sementara dan tanpa penugasan berulang di setiap cabang:

Seluruh switch (...) { ... } dievaluasi menjadi angka yang disimpan di days. Perhatikan titik koma setelah kurung kurawal penutup: titik koma itu bagian dari pernyataan penugasan. Switch expression harus exhaustive (mencakup setiap nilai yang mungkin), itulah sebabnya ada default di sini. Perhatikan juga bahwa cabang yang tidak cocok bisa melempar exception alih-alih mengembalikan nilai. Kalau sebuah cabang butuh beberapa pernyataan sebelum mengembalikan nilai, pakai blok dengan yield:

case 2 -> {
    boolean leap = (year % 4 == 0);
    yield leap ? 29 : 28;
}

yield adalah cara blok arrow menyerahkan nilainya, padanan break di dunia expression yang membawa sebuah hasil.

Berikutnya: for Loop

switch memilih satu cabang dari banyak pilihan; kadang yang kamu butuhkan justru mengulang sebuah blok berkali-kali. for loop menjalankan kode sebanyak jumlah yang terkendali, entah menghitung sepanjang suatu rentang atau melangkah ke setiap item, dan itulah topik halaman berikutnya.

Pertanyaan yang sering diajukan

Kapan sebaiknya memakai switch alih-alih if-else di Java?

Pakai switch saat kamu membandingkan satu nilai dengan banyak pilihan konstan yang tetap, seperti nomor hari, pilihan menu, atau sebuah enum. Bentuk ini lebih jelas dibaca daripada rantai if/else if yang panjang dan menunjukkan maksud "pilih satu cabang dari nilai-nilai yang sudah diketahui ini". Tetap pakai if/else kalau kondisimu melibatkan rentang (x > 10), beberapa variabel, atau apa pun yang bukan sekadar pengecekan kesamaan dengan konstanta.

Kenapa butuh break di pernyataan switch Java?

Di sintaks klasik dengan titik dua, begitu sebuah case cocok, eksekusi terus mengalir (fall through) ke case-case berikutnya sampai menemukan break atau akhir switch. break menghentikannya. Lupa menulisnya adalah bug klasik: kamu mencocokkan case 1: tetapi tanpa sengaja juga menjalankan kode untuk case 2:, case 3:, dan seterusnya. Sintaks arrow yang lebih baru (case 1 -> ...) tidak pernah fall through, jadi kamu sama sekali tidak perlu menulis break.

Apakah pernyataan switch di Java bisa dipakai untuk String?

Bisa. Sejak Java 7 kamu bisa memakai switch pada String, dan juga pada int, char, byte, short, tipe wrapper-nya, serta nilai enum. Kamu tidak bisa memakai switch pada long, double, float, atau boolean. Pencocokan string membedakan huruf besar dan kecil, jadi "Yes" dan "yes" adalah case yang berbeda.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai