Rantai else if cocok untuk rentang nilai, tetapi menjadi repetitif saat setiap cabang membandingkan satu variabel yang sama terhadap puluhan nilai diskret — hari dalam seminggu, kode wilayah, atau predikat huruf. Statement switch menyediakan bentuk khusus untuk kasus tersebut: satu selector expression dibandingkan sekali, lalu eksekusi melompat ke label case yang cocok. Struktur ini juga membawa perilaku khas warisan bahasa C bernama fall-through — eksekusi yang “tumpah” ke label berikutnya ketika break dilupakan — yang akan kita bedah tuntas karena menjadi sumber bug klasik. Chapter ini membahas bentuk klasik switch statement; bentuk modern berbentuk ekspresi menyusul pada chapter berikutnya.
Bentuk Dasar switch #
Bentuk klasiknya terdiri atas selector dalam tanda kurung dan deretan label case beserta default:
switch (selector) {
case nilai1:
// statement untuk nilai1
break;
case nilai2:
// statement untuk nilai2
break;
default:
// statement bila tidak ada label yang cocok
}Mekanisme di balik layar: JVM mengevaluasi selector sekali, membandingkan hasilnya dengan setiap label case dari atas ke bawah, lalu melompat ke label yang cocok dan terus mengeksekusi statement dari titik itu. Bandingkan dengan String memakai kesetaraan isi (equals), bukan alamat objek. Label default bersifat opsional dan menjadi tujuan lompatan bila tidak ada satu pun case yang cocok. Statement break mengakhiri eksekusi switch dan melanjutkan program setelah kurung kurawal penutup — perannya krusial, seperti akan kita lihat pada bagian fall-through.
Contoh pertama mengelompokkan hari ke dalam hari kerja dan akhir pekan:
public class HariAngka {
public static void main(String[] args) {
int hari = 6;
switch (hari) {
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("Hari " + hari + " adalah hari kerja.");
break;
case 6:
case 7:
System.out.println("Hari " + hari + " adalah akhir pekan.");
break;
default:
System.out.println("Angka hari tidak dikenali: " + hari);
}
}
}Output yang Dihasilkan:
Hari 6 adalah akhir pekan.Label case yang ditumpuk tanpa statement di antaranya adalah idiom resmi untuk menyatakan “nilai 1 sampai 5 berbagi cabang yang sama”. Untuk selector 6, eksekusi melompat ke case 6, langsung menjalankan println di bawahnya, lalu break menghentikan switch sebelum label default sempat dicapai.
Selector String dan Label Gabungan #
Sejak Java 7, switch menerima selector bertipe String — pembandingan dilakukan dengan equals sehingga isi teks yang sama persis berjalan ke cabang yang sama. Contoh berikut memetakan predikat huruf menjadi pesan, dengan label "A" dan "B" digabung dalam satu cabang:
public class PredikatHuruf {
public static void main(String[] args) {
String nilai = "B";
switch (nilai) {
case "A":
case "B":
System.out.println("Prestasi tinggi, pertahankan!");
break;
case "C":
System.out.println("Cukup, masih ada ruang naik.");
break;
case "D":
case "E":
System.out.println("Materi perlu dipelajari ulang.");
break;
default:
System.out.println("Nilai tidak dikenali: " + nilai);
}
}
}Output yang Dihasilkan:
Prestasi tinggi, pertahankan!Selector "B" cocok dengan label case "B"; karena label tersebut tidak memiliki statement sendiri, eksekusi turun ke println bersama milik "A" dan "B", lalu break menutup switch. Bandingkan versi if/else if yang setara — nilai.equals("A") || nilai.equals("B") — dan switch terasa jauh lebih ringkas untuk pemetaan nilai diskret.
Perilaku fall-through #
Kini jebakan utamanya. Bila break dilupakan, eksekusi tidak berhenti di ujung cabang — eksekusi terus berjalan menembus label-label di bawahnya sampai bertemu break, penutup switch, atau return. Perilaku ini bernama fall-through. Program berikut sengaja menghapus beberapa break agar perilakunya terlihat:
public class FallThrough {
public static void main(String[] args) {
String nilai = "A";
// Sengaja tanpa break untuk memperlihatkan fall-through
switch (nilai) {
case "A":
System.out.println("Memasuki case A");
case "B":
System.out.println("Memasuki case B");
case "C":
System.out.println("Memasuki case C");
break;
default:
System.out.println("Memasuki default");
}
System.out.println("Selesai.");
}
}Output yang Dihasilkan:
Memasuki case A
Memasuki case B
Memasuki case C
Selesai.Mari kita baca keluarannya baris demi baris:
- Baris 5 (
switch (nilai)): selector bernilai"A", eksekusi melompat kecase "A"dan mencetak “Memasuki case A”. - Ujung
case "A": tidak adabreak, sehingga eksekusi jatuh (fall through) kecase "B"dan mencetak baris kedua — padahal selector bukan"B". - Ujung
case "B": masih tanpabreak, eksekusi jatuh lagi kecase "C"dan mencetak baris ketiga. - Baris
breakpadacase "C": eksekusi akhirnya berhenti, keluar dariswitch, dan mencetak “Selesai.”. Labeldefaulttidak pernah dijalankan.
Tipe Selector yang Diizinkan #
Statement switch klasik menerima selector dengan tipe terbatas: char, byte, short, int beserta wrapper-nya (Character, Byte, Short, Integer), String, dan enum — tipe yang nilainya terbatas pada konstanta tetap. Tipe long, float, double, dan boolean tidak dapat menjadi selector karena perancang Java menilai kasus pemakaiannya nyaris tidak ada dalam praktik. Label case juga wajib berupa konstanta waktu kompilasi — literal seperti 6 atau "B" sah, sedangkan variabel biasa tidak; kondisi rentang seperti nilai >= 60 tetap milik if/else if.
Bentuk switch klasik kini kita pahami dari selector hingga break. Kurung kurawalnya terasa seremonial: mayoritas cabang hanya berisi satu statement penuh gaya lama. Java 14 memperkenalkan bentuk baru — switch expression — yang menghasilkan nilai, memakai arrow label, dan menanggalkan break. Chapter berikutnya mengulasnya lengkap.
Referensi #
- JLS SE25 §14.11: The switch Statement
- Oracle Tutorial: The switch Statement
- JEP 361: Switch Expressions
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
FallThrough.java
Unduh berkaspublic class FallThrough {
public static void main(String[] args) {
String nilai = "A";
// Sengaja tanpa break untuk memperlihatkan fall-through
switch (nilai) {
case "A":
System.out.println("Memasuki case A");
case "B":
System.out.println("Memasuki case B");
case "C":
System.out.println("Memasuki case C");
break;
default:
System.out.println("Memasuki default");
}
System.out.println("Selesai.");
}
}
HariAngka.java
Unduh berkaspublic class HariAngka {
public static void main(String[] args) {
int hari = 6;
switch (hari) {
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("Hari " + hari + " adalah hari kerja.");
break;
case 6:
case 7:
System.out.println("Hari " + hari + " adalah akhir pekan.");
break;
default:
System.out.println("Angka hari tidak dikenali: " + hari);
}
}
}
PredikatHuruf.java
Unduh berkaspublic class PredikatHuruf {
public static void main(String[] args) {
String nilai = "B";
switch (nilai) {
case "A":
case "B":
System.out.println("Prestasi tinggi, pertahankan!");
break;
case "C":
System.out.println("Cukup, masih ada ruang naik.");
break;
case "D":
case "E":
System.out.println("Materi perlu dipelajari ulang.");
break;
default:
System.out.println("Nilai tidak dikenali: " + nilai);
}
}
}