Pernyataan switch menguji satu nilai terhadap sejumlah label case dan langsung melompat ke cabang yang cocok, sehingga tabel keputusan yang panjang tidak perlu ditulis sebagai rantai else if. Topik ini menelusuri switch klasik, perilaku jatuhnya eksekusi tanpa break, bentuk panah yang dibakukan sejak Java 14, sampai switch expression yang menghasilkan nilai ke sebuah variabel. Ketiga bentuk itu melayani kebutuhan yang berbeda, dari peta keputusan sekali jalur sampai konversi nilai yang hasilnya langsung dipakai.
Switch klasik dan peran break#
Pemilih switch diuji terhadap label case satu per satu, dan cabang default menampung nilai yang tidak cocok dengan label mana pun. Tipe pemilihnya terbatas pada byte, short, char, int, pembungkus keempatnya, String, dan enum, sedangkan tipe pecahan serta boolean tidak diterima. Setelah label yang cocok ditemukan, pernyataan-pernyataan badannya dijalankan sampai break memerintahkan keluar dari switch.
public class KonversiHari {
public static void main(String[] args) {
int nomorHari = 6;
String nama;
switch (nomorHari) {
case 1:
nama = "Senin";
break;
case 2:
nama = "Selasa";
break;
case 3:
nama = "Rabu";
break;
case 4:
nama = "Kamis";
break;
case 5:
nama = "Jumat";
break;
case 6:
nama = "Sabtu";
break;
case 7:
nama = "Minggu";
break;
default:
nama = "Nomor tidak valid";
break;
}
System.out.println("Hari ke-" + nomorHari + ": " + nama);
}
}Hari ke-6: SabtuNilai 6 cocok dengan case 6, variabel nama diisi "Sabtu", lalu break mengakhiri switch sebelum label lain sempat disentuh. Tanpa break, eksekusi jatuh ke badan case berikutnya, perilaku yang disebut fall-through, dan nama akan ditimpa nilai hari setelahnya sampai akhir blok. Pemilih switch dievaluasi satu kali di awal, lalu hasilnya dibandingkan dengan label demi label. Pencocokannya persis sama nilainya, bukan rentang, sehingga keputusan berupa rentang tetap membutuhkan label per label. Diagram berikut memperlihatkan kedua jalur itu sejajar.
Fall-through tidak selalu salah. Beberapa label yang ditumpuk tanpa badan di antaranya memang dirancang berbagi satu badan, dan pola sah ini biasa dipakai untuk mengelompokkan nilai yang responsnya sama.
// tidak-dijalankan
switch (nomorHari) {
case 6:
case 7:
System.out.println("Akhir pekan");
break;
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("Hari kerja");
break;
default:
System.out.println("Nomor hari tidak valid");
break;
}Pada contoh ini maksudnya jelas, tetapi jatuhnya eksekusi antarbadan yang tidak disengaja tetap menjadi sumber bug pada switch klasik. Bentuk berikutnya menghilangkan persoalan itu sama sekali.
Bentuk panah yang tidak jatuh#
Java 14 membakukan bentuk panah, yaitu label yang ditulis case 6, 7 -> langsung diikuti badan cabangnya. Pada bentuk ini hanya cabang yang cocok yang pernah dijalankan, sehingga break tidak diperlukan dan risiko fall-through yang tidak disengaja hilang. Beberapa label dipisahkan koma untuk berbagi satu badan, sedangkan badannya boleh berupa satu pernyataan, blok kurung kurawal, atau throw.
public class SapaHari {
public static void main(String[] args) {
int nomorHari = 3;
switch (nomorHari) {
case 6, 7 -> System.out.println("Akhir pekan, tidak ada piket");
case 1, 2, 3, 4, 5 -> System.out.println("Hari kerja, ada piket");
default -> System.out.println("Nomor hari tidak valid");
}
}
}Hari kerja, ada piketBentuk panah menyingkat lima label contoh sebelumnya menjadi satu baris case 1, 2, 3, 4, 5 ->. Satu blok switch memakai satu gaya saja, sehingga label titik dua dan label panah tidak boleh bercampur di dalam blok yang sama, dan kekeliruan ini ditolak kompiler. Pada bentuk pernyataan, default boleh ditinggalkan bila nilai yang tidak terduga memang tidak perlu direspons, sedangkan bentuk yang menghasilkan nilai menuntutnya lebih ketat. Label panah juga menerima enum sebagai pemilihnya, dan pada enum yang seluruh konstantanya sudah tercakup, default memang boleh hilang. Untuk keputusan yang setiap cabangnya memilih teks atau angka tunggal, bentuk panah pada umumnya menggantikan switch klasik dengan kode yang lebih pendek.
Switch expression yang menghasilkan nilai#
Bentuk paling modern menjadikan seluruh switch sebagai switch expression, yakni ekspresi yang menghasilkan satu nilai sehingga bisa langsung diletakkan di sisi kanan penugasan. Kompiler menuntut keutuhan kasusnya, yaitu setiap nilai yang mungkin harus punya cabang, dan default menjadi wajib bila pemilihnya bukan enum yang kasusnya sudah menutup semua kemungkinan.
public class JumlahHari {
public static void main(String[] args) {
int bulan = 2;
int tahun = 2026;
int hari = switch (bulan) {
case 1, 3, 5, 7, 8, 10, 12 -> 31;
case 4, 6, 9, 11 -> 30;
case 2 -> {
boolean kabisat = (tahun % 4 == 0 && tahun % 100 != 0) || tahun % 400 == 0;
yield kabisat ? 29 : 28;
}
default -> throw new IllegalArgumentException("Nomor bulan harus 1 sampai 12");
};
System.out.println("Bulan " + bulan + " tahun " + tahun + " punya " + hari + " hari.");
}
}Bulan 2 tahun 2026 punya 28 hari.Cabang yang isinya lebih dari satu pernyataan ditulis sebagai blok, dan kata kunci yield mengirimkan hasilnya keluar, sebagaimana cabang Februari yang menghitung tahun kabisat lebih dahulu. Cabang default berupa throw tetap sah, karena menghentikan eksekusi adalah cara yang sah untuk tidak menghasilkan nilai. Tahun 2026 tidak habis dibagi 4 sehingga Februari jatuh pada 28 hari, dan hasil akhirnya menempel langsung pada variabel hari tanpa variabel perantara.
Bentuk ini paling cocok untuk tabel keputusan yang setiap cabangnya menghasilkan satu nilai, seperti konversi kode menjadi label, perhitungan tarif, dan penentuan jumlah hari. Bila cabangnya justru berisi langkah-langkah dengan efek samping, pernyataan switch dengan bentuk panah tetap menjadi pilihan yang lebih tepat.
Kesalahan umum#
- Melupakan
breakpada switch klasik. Eksekusi jatuh ke badancaseberikutnya dan menimpa hasil yang sudah benar, kesalahan yang paling sering muncul pada gaya ini. - Mencampur label titik dua dan label panah dalam satu blok switch. Kompiler menolaknya karena satu blok hanya boleh memakai satu gaya.
- Menambahkan
breakdi ujung setiap cabang bentuk panah. Cabang panah tidak jatuh ke bawah, sehinggabreaktersebut hanya menambah kebisingan. - Menghilangkan
defaultpada switch expression yang pemilihnyaint. Kompilasi berhenti karena tidak semua nilai input tercakup, dan menambahkandefaultmembetulkannya. - Memakai switch untuk keputusan berupa rentang. Label switch mencocokkan nilai persis, sehingga syarat seperti nilai di antara 1 sampai 12 lebih jelas ditulis sebagai rantai
else ifatau kondisi di dalam badan cabang. - Menganggap variabel yang dideklarasikan pada satu
casehanya hidup di cabang itu. Pada blok titik dua seluruhcaseberbagi satu lingkup, sehingga nama yang sama di cabang lain dianggap deklarasi ulang.
Ringkasan#
- Switch klasik melompat ke
caseyang cocok dan berhenti dibreak, sedangkan tanpabreakeksekusinya jatuh ke cabang berikutnya. - Bentuk panah sejak Java 14 menjalankan hanya cabang yang cocok, sehingga
breaktidak diperlukan dan beberapa label cukup dipisahkan koma. - Switch expression menghasilkan nilai, memakai
yielddi badan blok, dan menuntut seluruh kemungkinan input tercakup. - Pemilih switch terbatas pada tipe bulat,
String, danenum, sedangkan tipe pecahan danbooleantidak didukung.
Referensi#
- The switch Statement — Oracle Java Tutorials — Panduan resmi switch klasik, label, dan default.
- JEP 361: Switch Expressions — OpenJDK — Proposal yang membakukan bentuk panah dan switch expression pada Java 14.
- Chapter 14: Blocks, Statements, and Patterns — Oracle
— Spesifikasi pernyataan
switchpada JLS untuk Java SE 21.