Saat menulis kode dengan banyak kondisi, pasti Anda menggunakan pernyataan if-else atau switch . Tetapi alternatif untuk if-else ini memiliki kelemahan. Beberapa orang bahkan menyebut pernyataan peralihan sebagai "anti-pola".

Apa itu? Anti-pola adalah pola umum dari kode buruk, yaitu solusi buruk untuk suatu masalah. Pemrogram mencoba menghindarinya dalam kode, karena menurunkan kualitas kode.

Namun ada kabar baik: versi baru Java telah membawa banyak perubahan dalam sintaks bahasa, dan salah satu perubahan tersebut memengaruhi switch . Penasaran? Lalu mari kita menyelam.

Pertama-tama, perlu dijelaskan mengapa sakelar adalah anti-pola. Pertimbangkan kode berikut:


switch (condition) {
    case "DECEMBER":
        seasonNumber = 1;
        break;
    case "JANUARY":
        seasonNumber = 1;
        break;
    case "FEBRUARY":
        seasonNumber = 1;
        break;
    default:
        seasonNumber = 0;
}

Oke, jadi belum sepenuhnya jelas mengapa ini disebut "anti-pola".

Tapi bagaimana jika kita menambahkan lebih banyak blok huruf dan sekarang kodenya terlihat seperti ini:


switch (condition) {
    case "DECEMBER":
        seasonNumber = 1;
        break;
    case "JANUARY":
        seasonNumber = 1;
        break;
    case "FEBRUARY":
        seasonNumber = 1;
        break;
    case “MARCH”:
        seasonNumber = 2;
        break;
    case “APRIL”:
        seasonNumber = 2;
        break;
    case “MAY”:
        seasonNumber = 2;
        break;
    default:
        seasonNumber = 0;
}

Mari tambahkan beberapa baris lagi — kode bertambah panjang. Nanti kita dapat menambahkan lebih banyak baris, dan tidak ada yang akan menghentikan kita melakukan ini.

Inilah inti masalahnya: setelah awalnya membuat pernyataan sakelar yang ringkas, kami menambahkan lebih banyak kode ke dalamnya, mengambil lebih banyak ruang — lebih dari yang muat di layar — dan membuat kode tidak nyaman untuk dibaca dan dipelihara.

Perbedaan antara pernyataan switch dan ekspresi switch

Java 14 memperkenalkan sakelar baru dan lebih baik. Ini bukan pernyataan switch , melainkan ekspresi switch .

Apa bedanya, Anda bertanya? Perbedaannya adalah bahwa pernyataan adalah instruksi yang melakukan serangkaian operasi tertentu, tetapi ekspresi adalah bagian dari kode yang melakukan perhitungan dan mengembalikan hasil.

Dengan kata lain, sekarang Anda dapat menyimpan hasil peralihan ke variabel.

Cukup berbicara. Sekarang mari kita lihat seperti apa saklar baru itu :


var result = switch(month) {
     case DECEMBER, JANUARY, FEBRUARY -> 1;
     case MARCH, APRIL, MAY -> 2;
    case JUNE, JULY, AUGUST -> 3;
    case SEPTEMBER, OCTOBER, NOVEMBER -> 4;
    default -> 0; 
};

Hal pertama yang menarik perhatian Anda adalah seberapa ringkas kodenya. Kode yang digunakan untuk memenuhi sebagian besar layar kini hanya terdiri dari beberapa baris dan terlihat jauh lebih mudah dibaca.

-> operator

Anda juga harus mencatat -> operator (operator panah). Anda mungkin sudah terbiasa dengannya jika Anda memiliki pengalaman dengan ekspresi lambda.

Itu berarti sekarang Anda dapat menulis sakelar yang tampak keren dengan gaya pernyataan lambda. Operator panah menunjukkan bahwa kompiler tidak akan melanjutkan ke ekspresi case berikutnya (jika blok case saat ini tidak memiliki pernyataan break atau return ), tetapi sebaliknya akan memberi Anda nilai ekspresi di sebelah kanan panah.

Anda juga dapat menulis kode yang bukan ekspresi dan hanya melakukan tindakan tertentu alih-alih mengembalikan apa pun:


switch(condition) {
    case TRUE, FALSE -> System.out.println("True/false");
  
    default -> System.out.println("Another");
}

Perhatikan bahwa sakelar tidak lagi memiliki pernyataan break . Itu dihapus di Java 13 dan diganti dengan yield .

Apa itu hasil dan di mana bisa digunakan?

Ketika sebuah sakelar terdiri dari satu baris, operator -> itu sendiri mengembalikan nilainya. Tetapi bagaimana jika kita tidak memiliki satu, tetapi banyak baris kode? Dalam kasus seperti itu, operator panah tidak akan mengembalikan nilai, karena ada banyak baris, bukan satu.

Mungkin kita bisa menggunakan return ? Bagaimanapun, ini digunakan untuk mengembalikan nilai di Jawa. Sayangnya, tidak, pengembalian tidak akan berfungsi dengan sakelar. Jadi apa yang bisa kita gunakan? Dulu ada break , tapi itu sudah dihapus di Java 13. Tapi sebagai gantinya kita sekarang punya yield — kata kunci baru yang membantu Anda mengembalikan nilai dari sebuah switch. Ini analog dengan mengembalikan pernyataan dalam metode.


var result = switch(condition) {
//…
case "Hi" -> "greeting"
//…
};  

Kode ini berisi satu baris, dan operator -> akan mengembalikan "salam".

Tetapi ketika kita memiliki blok kode:


var result = switch(condition) {
//…
case "Hi" -> {
// Your code
 Here you need to return "greeting"
	}
};  

Kata kunci yang akan membantu Anda mengembalikan nilai adalah hasil :


var result = switch(condition) {
//…
case "Hi" -> {
// Your code
 yield "greeting";

	}
};

hasil ditambahkan di Java 13 untuk kasus di mana kami memiliki lebih dari satu baris kode dalam blok kasus dan kami perlu mengembalikan hasilnya.

Anda mungkin ingin mencoba tombol baru dalam kode Anda, tetapi ingat bahwa Anda memerlukan Java 14 atau lebih tinggi untuk melakukannya. Dengan versi sebelumnya, sakelar ini hanya akan tersedia jika Anda menentukan tanda "--enable-preview" pada baris perintah, karena sebelum versi 14 itu adalah bagian dari pratinjau teknis, bukan bagian bahasa yang lengkap.

Itu saja untuk saat ini! Sampai jumpa!