switch

Memakai switch klasik dan bentuk panah modern Java 14, sampai switch expression yang mengembalikan nilai.

Daftar isi

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.

java KonversiHari.java
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);
    }
}
text Keluaran
Hari ke-6: Sabtu

Nilai 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.

Alur switch klasiknilai diujicase yang cocokbadan case dijalankanbreakkeluar switchtanpa breakcase berikutnya
Alur switch klasik, dari case yang cocok sampai keluar

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.

java Contoh: label yang digabungkan untuk satu cabang
// 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.

java SapaHari.java
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");
        }
    }
}
text Keluaran
Hari kerja, ada piket

Bentuk 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.

java JumlahHari.java
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.");
    }
}
text Keluaran
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 break pada switch klasik. Eksekusi jatuh ke badan case berikutnya 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 break di ujung setiap cabang bentuk panah. Cabang panah tidak jatuh ke bawah, sehingga break tersebut hanya menambah kebisingan.
  • Menghilangkan default pada switch expression yang pemilihnya int. Kompilasi berhenti karena tidak semua nilai input tercakup, dan menambahkan default membetulkannya.
  • 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 if atau kondisi di dalam badan cabang.
  • Menganggap variabel yang dideklarasikan pada satu case hanya hidup di cabang itu. Pada blok titik dua seluruh case berbagi satu lingkup, sehingga nama yang sama di cabang lain dianggap deklarasi ulang.

Ringkasan#

  • Switch klasik melompat ke case yang cocok dan berhenti di break, sedangkan tanpa break eksekusinya jatuh ke cabang berikutnya.
  • Bentuk panah sejak Java 14 menjalankan hanya cabang yang cocok, sehingga break tidak diperlukan dan beberapa label cukup dipisahkan koma.
  • Switch expression menghasilkan nilai, memakai yield di badan blok, dan menuntut seluruh kemungkinan input tercakup.
  • Pemilih switch terbatas pada tipe bulat, String, dan enum, sedangkan tipe pecahan dan boolean tidak didukung.

Referensi#