Apabila menulis kod dengan banyak syarat, pastinya anda telah menggunakan sama ada pernyataan if-else atau suis . Tetapi alternatif ini kepada if-else mempunyai kelemahan. Sesetengah orang telah memanggil kenyataan suis sebagai "anti-corak".

Apa itu? Anti-corak ialah corak biasa kod buruk, iaitu penyelesaian buruk kepada masalah. Pengaturcara cuba mengelakkannya dalam kod, kerana mereka merendahkan kualiti kod.

Tetapi ada berita baik: versi baharu Java telah membawa banyak perubahan dalam sintaks bahasa, dan salah satu daripada perubahan tersebut mempengaruhi switch . Tertarik? Lepas tu jom kita terjun.

Sebagai permulaan, perlu dijelaskan mengapa suis adalah anti-corak. Pertimbangkan kod berikut:


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

Okey, jadi masih belum jelas sepenuhnya mengapa ini adalah "anti-corak".

Tetapi bagaimana jika kita menambah lebih banyak blok kes dan kini kodnya kelihatan 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 tambah beberapa baris lagi — kod bertambah panjang. Kemudian kita boleh menambah lebih banyak baris, dan tiada siapa akan menghalang kita daripada melakukan ini.

Inilah inti masalahnya: selepas mencipta kenyataan suis padat pada mulanya, kami menambah lebih banyak kod padanya, mengambil lebih banyak ruang — lebih banyak daripada yang akan dimuatkan pada skrin — dan menjadikan kod itu menyusahkan untuk dibaca dan diselenggara.

Perbezaan antara pernyataan suis dan ungkapan suis

Java 14 memperkenalkan suis baharu dan lebih baik. Ia bukan pernyataan suis , sebaliknya ungkapan suis .

Apakah perbezaannya, anda bertanya? Perbezaannya ialah pernyataan ialah arahan yang melaksanakan set operasi tertentu, tetapi ungkapan ialah sekeping kod yang melakukan beberapa pengiraan dan mengembalikan hasil.

Dengan kata lain, kini anda boleh menyimpan hasil suis kepada pembolehubah.

Cukup bercakap. Sekarang mari lihat rupa suis baharu :


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; 
};

Perkara pertama yang menarik perhatian anda ialah betapa padatnya kod itu. Kod yang digunakan untuk menggunakan kebanyakan skrin kini merangkumi beberapa baris dan kelihatan lebih mudah dibaca.

-> pengendali

Anda juga harus perhatikan operator -> (pengendali anak panah). Anda mungkin sudah biasa dengannya jika anda mempunyai pengalaman dengan ungkapan lambda.

Ini bermakna sekarang anda boleh menulis suis yang kelihatan keren dalam gaya pernyataan lambda. Pengendali anak panah menunjukkan bahawa pengkompil tidak akan meneruskan ke ungkapan kes seterusnya (jika blok kes semasa tidak mempunyai penyataan rehat atau kembali ), sebaliknya akan memberikan anda nilai ungkapan di sebelah kanan anak panah.

Anda juga boleh menulis kod yang bukan ungkapan dan hanya melakukan tindakan tertentu dan bukannya mengembalikan apa-apa:


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

Ambil perhatian bahawa suis tidak lagi mempunyai pernyataan putus . Ia telah dialih keluar dalam Java 13 dan digantikan dengan hasil .

Apakah hasil dan di mana ia boleh digunakan?

Apabila suis terdiri daripada satu baris, pengendali -> itu sendiri mengembalikan nilai. Tetapi bagaimana jika kita tidak mempunyai satu, tetapi banyak baris kod? Dalam kes sedemikian, pengendali anak panah tidak akan mengembalikan nilai, kerana terdapat berbilang baris, bukan satu.

Mungkin kita boleh menggunakan pulangan ? Lagipun, ia digunakan untuk mengembalikan nilai dalam Java. Malangnya, tidak, pulangan tidak akan berfungsi dengan suis. Jadi apa yang boleh kita gunakan? Dahulu terdapat break , tetapi itu telah dialih keluar dalam Java 13. Tetapi sebagai gantinya, kami kini mempunyai hasil — kata kunci baharu yang membantu anda mengembalikan nilai daripada suis. Ia adalah analog untuk mengembalikan pernyataan dalam kaedah.


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

Kod ini mengandungi satu baris, dan pengendali -> akan mengembalikan "salam".

Tetapi apabila kita mempunyai blok kod:


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

Kata kunci yang akan membantu anda mengembalikan nilai ialah hasil :


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

	}
};

hasil telah ditambahkan dalam Java 13 untuk kes di mana kita mempunyai lebih daripada satu baris kod dalam blok kes dan kita perlu mengembalikan hasil.

Anda mungkin tidak sabar-sabar untuk mencuba suis baharu dalam kod anda, tetapi ingat bahawa anda memerlukan Java 14 atau lebih tinggi untuk melakukan ini. Dengan versi terdahulu, suis ini hanya akan tersedia jika anda menentukan bendera "--dayakan-pratonton" pada baris arahan, kerana sebelum versi 14 ia adalah sebahagian daripada pratonton teknikal, bukan sebahagian daripada bahasa sepenuhnya.

Itu sahaja buat masa ini! jumpa lagi!