CodeGym /Blog Java /rawak /Pernyataan suis Java
John Squirrels
Tahap
San Francisco

Pernyataan suis Java

Diterbitkan dalam kumpulan

Sedikit teori tentang Java Switch

Bayangkan anda seorang kesatria berhenti di persimpangan jalan. Jika anda pergi ke kiri, anda akan kehilangan kuda anda. Jika anda pergi dengan betul, anda akan mendapat ilmu. Bagaimanakah kami akan mewakili situasi ini dalam kod? Anda mungkin sudah tahu bahawa kami menggunakan binaan seperti if-then dan if-then-else untuk membuat keputusan ini.

if (turn_left) { 
    System.out.println("You will lose your horse"); 
}
if (turn_right) {
    System.out.println("You will gain knowledge");
}
else 
    System.out.println("So you're just going to stand there?");

Tetapi bagaimana jika jalan itu tidak berpecah kepada dua, tetapi kepada sepuluh? Anda mempunyai jalan yang "sepenuhnya ke kanan", "sedikit ke kiri itu", "sedikit lagi ke kiri" dan sebagainya, berjumlah 10 jalan yang mungkin? Bayangkan bagaimana kod "if-then-else " anda akan berkembang dalam versi ini!

if (option1)
{…}
else if (option2)
{…}
…
else if (optionN) ...
Katakan anda mempunyai persimpangan 10 hala di jalan (adalah penting di sini bahawa bilangan pilihan adalah terhad). Untuk situasi sedemikian, Java mempunyai pernyataan suis .

       switch (ExpressionForMakingAChoice) {
           case (Value1):
               Code1;
               break;
           case (Value2):
               Code2;
               break;
...
           case (ValueN):
               CodeN;
               break;
           default:
               CodeForDefaultChoice;
               break;
       }

Begini cara pernyataan itu berfungsi:
  • ExpressionForMakingAChoice dinilai. Kemudian penyataan suis membandingkan nilai yang terhasil dengan ValueX seterusnya (dalam susunan ia disenaraikan).
  • Jika ExpressionForMakingAChoice sepadan dengan ValueX, maka kod yang mengikuti kolon akan dilaksanakan.
  • Jika kenyataan putus ditemui, maka kawalan dipindahkan ke luar pernyataan suis.
  • Jika ExpressionForMakingAChoice tidak sepadan dengan mana-mana ValueX, maka kawalan beralih kepada CodeForDefaultCase.
Perkara penting
  • Dalam pernyataan suis, jenis ExpressionForMakingAChoice mestilah salah satu daripada yang berikut:

    • bait , pendek , char , int .
    • Byte , Short , Character , Integer (pembungkus jenis data primitif).
    • rentetan .
    • Enum .
  • Blok lalai adalah pilihan. Jika ia tiada dan ExpressionForMakingAChoice tidak sepadan dengan mana-mana ValueX, maka tiada tindakan akan dilaksanakan.
  • Pernyataan rehat tidak diperlukan. Jika ia tiada, kod akan terus dilaksanakan (mengabaikan perbandingan lanjut dalam penyata kes) sehingga kejadian pertama pemecahan atau sehingga penghujung penyataan suis .
  • Jika kod yang sama perlu dilaksanakan untuk beberapa pilihan, kita boleh menghapuskan pertindihan dengan menetapkan beberapa pernyataan kes berturut-turut .

Sekarang mari kita lihat bagaimana pernyataan suis digunakan dalam Java

Jangan risau: kita sudah selesai dengan teorinya. Selepas anda melihat contoh berikut, semuanya akan menjadi lebih jelas. Baiklah, mari kita mulakan. Mari kita lihat contoh daripada astronomi yang melibatkan planet-planet sistem suria kita. Selaras dengan sikap antarabangsa terkini, kami telah mengecualikan Pluto (kerana sifat orbitnya). Kita ingat bahawa planet kita disusun mengikut jaraknya dari Matahari seperti berikut: Utarid, Zuhrah, Bumi, Marikh, Musytari, Zuhal, Uranus dan Neptun. Mari tulis kaedah Java yang mengambil nombor ordinal planet (berbanding jaraknya dari Matahari) dan mengembalikan komponen utama atmosfera planet sebagai Senarai <String>. Anda akan ingat bahawa sesetengah planet mempunyai komposisi atmosfera yang serupa. Oleh itu, Zuhrah dan Marikh mengandungi terutamanya karbon dioksida; atmosfera Musytari dan Zuhal terdiri daripada hidrogen dan helium; dan Uranus dan Neptun menambah metana kepada pasangan gas terakhir. Inilah fungsi kami:

public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
    List<String> result = new ArrayList<>();
    switch (seqNumberFromSun) {
        case 1: result.add("No atmosphere");
            break;
        case 2:
        case 4: result.add("Carbon dioxide");
            break;
        case 3: result.add("Carbon dioxide");
            result.add("Nitrogen");
            result.add ("Oxygen");
            break;
        case 5:
        case 6: result.add("Hydrogen");
            result.add("Helium");
            break;
        case 7:
        case 8: result.add("Methane");
            result.add("Hydrogen");
            result.add("Helium");
            break;
        default:
            break;
    }
    return result;
}
Ambil perhatian bahawa kami menggunakan kod yang sama untuk planet dengan komposisi atmosfera yang sama. Kami melakukan ini dengan menggunakan pernyataan kes berturut-turut . Jika kita ingin mendapatkan komposisi atmosfera planet asal kita, kita memanggil kaedah kita dengan 3 sebagai hujah:

getPlanetAtmosphere(3).
System.out.println(getPlanetAtmosphere(3)) returns ["Carbon dioxide", "Nitrogen", "Oxygen"].
Eksperimen dengan rehat: Apakah yang berlaku jika kami mengalih keluar semua pernyataan rehat ? Mari cuba:

    public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
        List<String> result = new ArrayList<>();
        switch (seqNumberFromSun) {
            case 1: result.add("No atmosphere");
            case 2:
            case 4: result.add("Carbon dioxide");
            case 3: result.add("Carbon dioxide");
                result.add("Nitrogen");
                result.add ("Oxygen");
            case 5:
            case 6: result.add("Hydrogen");
                result.add("Helium");
            case 7:
            case 8: result.add("Methane");
                result.add("Hydrogen");
                result.add("Helium");
            default:
        }
        return result;
    }
Jika kita mencetak hasil System.out.println(getPlanetAtmosphere(3)) , maka kita dapati bahawa planet asal kita tidak begitu sesuai untuk didiami. Atau inikah? Nilailah sendiri: ["Karbon dioksida", "Nitrogen", "Oksigen", "Hidrogen", "Helium", "Metana", "Hidrogen", "Helium"] . Mengapa ini berlaku? Program ini melaksanakan semua pernyataan kes selepas perlawanan pertama sehingga akhir blok suis .

Pengoptimuman penyataan rehat yang berlebihan

Ambil perhatian bahawa kita boleh menambah baik kaedah dengan menyusun penyataan dan kes rehat secara berbeza.

public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
    List<String> result = new ArrayList<>();
    switch (seqNumberFromSun) {
        case 1: result.add("No atmosphere");
                break;
        case 3: result.add("Nitrogen");
                result.add ("Oxygen");
        case 2:
        case 4: result.add("Carbon dioxide");
                break;
        case 7:
        case 8: result.add("Methane");
        case 5:
        case 6: result.add("Hydrogen");
                result.add("Helium");
    }
     return result;
}
Nampak kurang kod, kan? Kami telah mengurangkan jumlah kenyataan dengan bermain-main dengan susunan pernyataan kes dan mengumpulkannya semula. Kini setiap jenis gas ditambahkan pada senarai hanya dalam satu baris kod. Kod yang diberikan dalam contoh terakhir hanya untuk menunjukkan cara kerja. Kami tidak mengesyorkan menulis kod dengan cara ini. Jika pengarang kod Java tersebut (apatah lagi pengaturcara lain) mesti mengekalkannya, dia akan mendapati sangat sukar untuk membina semula logik di sebalik pembentukan blok kes tersebut dan kod yang dilaksanakan dalam pernyataan suis .

Perbezaan daripada jika

Memandangkan persamaan luaran bagi pernyataan if dan suis , jangan lupa bahawa pernyataan suis memilih salah satu kes berdasarkan NILAI KHUSUS, manakala pernyataan if boleh mempunyai sebarang ungkapan boolean. Ingat perkara ini semasa mereka bentuk kod anda.

Kesimpulan

  • Gunakan pernyataan kes untuk lebih daripada dua cawangan agar tidak mengacaukan kod anda dengan pernyataan if.
  • Jangan lupa untuk melengkapkan blok logik cawangan untuk setiap nilai tertentu (kenyataan kes) dengan memasukkan pernyataan putus .
  • Ungkapan pernyataan suis boleh menjadi Enum atau String , serta beberapa jenis primitif .
  • Ingat blok lalai . Gunakannya untuk mengendalikan nilai yang tidak dijangka.
  • Untuk mengoptimumkan prestasi, alihkan cawangan kod yang sepadan dengan nilai yang paling biasa ke permulaan blok suis .
  • Jangan terbawa-bawa dalam "pengoptimuman" anda dengan memadamkan pernyataan rehat pada akhir pernyataan kes – kod sedemikian sukar difahami dan, akibatnya, sukar untuk dikekalkan.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION