Penyataan Switch Java

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan mengetahui apa itu pernyataan peralihan dan cara menggunakannya.

The suis kenyataan membolehkan kita untuk menggantikan beberapa bersarang if-lagi yang membina dan dengan itu meningkatkan kebolehbacaan kod kami.

Switch telah berkembang dari masa ke masa - jenis baru yang disokong telah ditambahkan, terutama di Java 5 dan 7. Juga, ia terus berkembang - ekspresi suis kemungkinan akan diperkenalkan di Java 12.

Di bawah ini kami akan memberikan beberapa contoh kod untuk menunjukkan penggunaan pernyataan suis , peranan pernyataan putus , syarat untuk nilai argumen / kes suis dan perbandingan String s dalam pernyataan suis .

Mari kita beralih kepada contoh.

2. Contoh Penggunaan

Katakan, kami mempunyai pernyataan bersarang if-else berikut :

public String exampleOfIF(String animal) { String result; if (animal.equals("DOG") || animal.equals("CAT")) { result = "domestic animal"; } else if (animal.equals("TIGER")) { result = "wild animal"; } else { result = "unknown animal"; } return result; }

Kod di atas tidak kelihatan baik dan sukar dijaga dan difikirkan. Untuk meningkatkan keterbacaan, kita boleh menggunakan pernyataan beralih di sini:

public String exampleOfSwitch(String animal) { String result; switch (animal) { case "DOG": result = "domestic animal"; break; case "CAT": result = "domestic animal"; break; case "TIGER": result = "wild animal"; break; default: result = "unknown animal"; break; } return result; }

Seperti yang ditunjukkan di atas, kami membandingkan haiwan argumen beralih dengan beberapa nilai kes . Sekiranya tidak ada nilai kes yang sama dengan argumen, maka blok di bawah label lalai dijalankan.

Ringkasnya, pernyataan rehat digunakan untuk keluar dari pernyataan beralih .

3. Pernyataan rehat

Walaupun kebanyakan pernyataan peralihan dalam kehidupan nyata menunjukkan bahawa hanya satu blok kes yang harus dilaksanakan, pernyataan putus adalah perlu untuk keluar dari suis setelah blok selesai.

Sekiranya kita lupa menulis jeda , blok di bawahnya akan dilaksanakan.

Untuk menunjukkan ini, mari hilangkan pernyataan rehat dan tambahkan output ke konsol untuk setiap blok:

public String forgetBreakInSwitch(String animal) { switch (animal) { case "DOG": System.out.println("domestic animal"); default: System.out.println("unknown animal"); } }

Mari laksanakan kod ini lupaBreakInSwitch ( "DOG"), dan periksa output untuk membuktikan bahawa semua blok dapat dilaksanakan:

domestic animal unknown animal

Oleh itu, kita harus berhati-hati dan menambahkan pernyataan rehat di akhir setiap blok kecuali ada keperluan untuk meneruskan ke kod di bawah label berikutnya.

Satu-satunya blok di mana jeda tidak diperlukan adalah yang terakhir, tetapi menambahkan jeda ke blok terakhir menjadikan kod kurang rentan ralat.

Kita juga dapat memanfaatkan tingkah laku ini untuk menghilangkan putus ketika kita mahu kod yang sama dilaksanakan untuk beberapa pernyataan kes. Mari tulis semula contoh di bahagian sebelumnya dengan mengumpulkan 2 kes pertama:

public String exampleOfSwitch(String animal) { String result; switch (animal) { case "DOG": case "CAT": result = "domestic animal"; break; case "TIGER": result = "wild animal"; break; default: result = "unknown animal"; break; } return result; }

4. menukar Argumen dan Nilai kes

Sekarang mari kita bincangkan jenis argumen suis dan nilai kes yang dibenarkan , syarat untuknya dan bagaimana pernyataan suis berfungsi dengan Strings.

4.1. Jenis Data

Kami tidak dapat membandingkan semua jenis objek dan primitif dalam pernyataan beralih . A suis hanya berfungsi dengan empat primitif dan pembalut mereka, dan juga dengan jenis enum dan String kelas:

  • bait dan bait
  • pendek dan Pendek
  • int dan Integer
  • char dan Watak
  • enum
  • Tali

Jenis tali boleh didapati dalam pernyataan beralih bermula dengan Java 7.

jenis enum diperkenalkan di Java 5 dan telah tersedia dalam pernyataan beralih sejak itu.

Kelas pembungkus juga telah tersedia sejak Java 5.

Sudah tentu, argumen beralih dan nilai kes harus sama jenisnya.

4.2. Tiada Nilai batal

Kami tidak dapat meneruskan nilai nol sebagai argumen ke pernyataan peralihan . Sekiranya kita melakukannya, program akan membuang NullPointerException, menggunakan contoh suis pertama kami :

@Test(expected=NullPointerException.class) public void whenSwitchAgumentIsNull_thenNullPointerException() { String animal = null; Assert.assertEquals("domestic animal", s.exampleOfSwitch(animal)); }

Sudah tentu, kita juga tidak boleh memberikan nol sebagai nilai pada label kes pernyataan peralihan . Sekiranya kita melakukannya, kodnya tidak akan disusun.

4.3. Nilai Kes sebagai Pemalar Masa Kompilasi

Sekiranya kita cuba mengganti nilai kes DOG dengan anjing pemboleh ubah kod tidak akan disusun sehingga kita menandakan pemboleh ubah anjing sebagai akhir :

final String dog="DOG"; String cat="CAT"; switch (animal) { case dog: //compiles result = "domestic animal"; case cat: //does not compile result = "feline" }

4.4. Perbandingan Rentetan

Sekiranya pernyataan beralih menggunakan operator persamaan untuk membandingkan rentetan, kami tidak dapat membandingkan argumen String yang dibuat dengan operator baru dengan nilai kes String dengan betul.

Nasib baik, pengendali suis menggunakan kaedah sama () di bawah tudung .

Mari tunjukkan ini:

@Test public void whenCompareStrings_thenByEqual() { String animal = new String("DOG"); assertEquals("domestic animal", s.exampleOfSwitch(animal)); }

5. menukar Ekspresi

JDK 13 kini tersedia dan membawa versi yang lebih baik dari ciri baru yang pertama kali diperkenalkan di JDK 12: ungkapan suis .

Untuk mengaktifkannya, kita perlu meneruskan –mengaktifkan pratonton ke penyusun.

5.1. Ungkapan suis Baru

Mari kita lihat seperti apa ekspresi suis baru ketika beralih selama berbulan-bulan:

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

Menghantar dalam nilai seperti Bulan.JUNE akan menetapkan hasil menjadi 3.

Perhatikan bahawa sintaks baru menggunakan operator -> dan bukannya titik dua yang biasa kita gunakan untuk menukar pernyataan. Juga, tidak ada kata kunci putus : Ungkapan beralih tidak jatuh pada huruf besar .

Tambahan lain adalah hakikat bahawa kita sekarang boleh mempunyai kriteria pembatas koma.

5.2. Yang hasil Kata-kata

Melangkah lebih jauh, ada kemungkinan untuk mendapatkan kawalan terperinci terhadap apa yang berlaku di sebelah kanan ungkapan dengan menggunakan blok kod. Dalam kes seperti ini, kita perlu menggunakan hasil kata kunci :

var result = switch (month) { case JANUARY, JUNE, JULY -> 3; case FEBRUARY, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER -> 1; case MARCH, MAY, APRIL, AUGUST -> { int monthLength = month.toString().length(); yield monthLength * 4; } default -> 0; };

Walaupun contoh kita agak sewenang-wenang, intinya di sini ialah kita mendapat akses ke lebih banyak bahasa Java di sini.

5.3. Mengembalikan Ekspresi suis Dalam

Sebagai akibat dari perbezaan antara pernyataan suis dan ungkapan suis , adalah mungkin untuk kembali dari dalam pernyataan suis , tetapi kami tidak dibenarkan melakukannya dari dalam ungkapan suis .

Contoh berikut betul dan akan menyusun:

switch (month) { case JANUARY, JUNE, JULY -> { return 3; } default -> { return 0; } }

Walau bagaimanapun, kod berikut tidak akan disusun, kerana kami cuba kembali ke luar ungkapan suis terlampir:

var result = switch (month) { case JANUARY, JUNE, JULY -> { return 3; } default -> { return 0; } };

5.4. Keletihan

Apabila menggunakan pernyataan suis , tidak menjadi masalah sekiranya semua kes dilindungi .

The following code, for example, is perfectly valid and will compile:

switch (month) { case JANUARY, JUNE, JULY -> 3; case FEBRUARY, SEPTEMBER -> 1; }

For switch expressions though, the compiler insists that all possible cases are covered. The following code snippet, for example, would not compile, as there's no default case and not all possible cases are covered:

var result = switch (month) { case JANUARY, JUNE, JULY -> 3; case FEBRUARY, SEPTEMBER -> 1; }

The switch expression, however, will be valid when all possible cases are covered, like in the following example:

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

Please note that the above code snippet does not have a default case. As long as all cases are covered, the switch expression will be valid.

6. Conclusion

Dalam tutorial ini, kami telah mempelajari kehalusan menggunakan pernyataan beralih di Java. Kami boleh memutuskan sama ada menggunakan suis berdasarkan kebolehbacaan dan jenis nilai yang dibandingkan.

Pernyataan pertukaran adalah calon yang baik untuk kes-kes apabila kita mempunyai sejumlah pilihan dalam set yang telah ditentukan (contoh: hari dalam seminggu). Jika tidak, kita harus mengubah kod setiap kali nilai baru ditambahkan atau dikeluarkan, yang mungkin tidak dapat dilaksanakan. Untuk kes-kes ini, kita harus mempertimbangkan pendekatan lain seperti polimorfisme atau corak reka bentuk lain seperti Perintah.

Seperti biasa kod JDK 8 dan kod JDK 13 yang lengkap boleh didapati di GitHub.