CodeGym /Java Blog /Acak /Pernyataan saklar Java
John Squirrels
Level 41
San Francisco

Pernyataan saklar Java

Dipublikasikan di grup Acak

Sedikit teori tentang Java Switch

Bayangkan Anda seorang kesatria yang berhenti di persimpangan jalan. Jika Anda ke kiri, Anda akan kehilangan kuda Anda. Jika Anda pergi dengan benar, Anda akan mendapatkan pengetahuan. Bagaimana kita merepresentasikan situasi ini dalam kode? Anda mungkin sudah mengetahui bahwa kami menggunakan konstruksi 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?");

Tapi bagaimana jika jalan itu terbelah bukan menjadi dua, tapi menjadi sepuluh? Anda memiliki jalan yang "benar-benar ke kanan", "sedikit ke kiri", "sedikit ke kiri" dan seterusnya, dengan total 10 kemungkinan jalan? Bayangkan bagaimana kode "if-then-else " Anda akan berkembang di versi ini!

if (option1)
{…}
else if (option2)
{…}
…
else if (optionN) ...
Misalkan Anda memiliki pertigaan 10 arah di jalan (penting di sini bahwa jumlah opsi terbatas). Untuk situasi seperti itu, Java memiliki pernyataan switch .

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

Beginilah cara pernyataan itu bekerja:
  • ExpressionForMakingAChoice dievaluasi. Kemudian pernyataan switch membandingkan nilai yang dihasilkan dengan ValueX berikutnya (dalam urutan daftarnya).
  • Jika ExpressionForMakingAChoice cocok dengan ValueX, maka kode yang mengikuti titik dua akan dijalankan.
  • Jika pernyataan break ditemukan, maka kontrol dipindahkan ke luar pernyataan switch.
  • Jika ExpressionForMakingAChoice tidak cocok dengan ValueX mana pun, kontrol diteruskan ke CodeForDefaultCase.
Poin penting
  • Dalam pernyataan switch, tipe ExpressionForMakingAChoice harus salah satu dari berikut ini:

    • byte , pendek , char , int .
    • Byte , Short , Character , Integer (pembungkus tipe data primitif).
    • Tali .
    • Jumlah .
  • Blok default adalah opsional. Jika tidak ada dan ExpressionForMakingAChoice tidak cocok dengan ValueX apa pun, maka tidak ada tindakan yang akan dijalankan.
  • Pernyataan break tidak diperlukan. Jika tidak ada, kode akan terus dieksekusi (mengabaikan perbandingan lebih lanjut dalam pernyataan kasus) hingga kemunculan break pertama atau hingga akhir pernyataan switch .
  • Jika kode yang sama perlu dieksekusi untuk beberapa pilihan, kita dapat menghilangkan duplikasi dengan menetapkan beberapa pernyataan kasus berurutan.

Sekarang mari kita lihat bagaimana pernyataan switch digunakan di Java

Jangan khawatir: kita sudah selesai dengan teorinya. Setelah Anda melihat contoh berikut, semuanya akan menjadi lebih jelas. Baiklah, mari kita mulai. Mari kita lihat contoh dari astronomi yang melibatkan planet-planet tata surya kita. Sesuai dengan sikap internasional terbaru, kami mengecualikan Pluto (karena sifat orbitnya). Kita ingat bahwa planet kita diatur berdasarkan jaraknya dari Matahari sebagai berikut: Merkurius, Venus, Bumi, Mars, Jupiter, Saturnus, Uranus, dan Neptunus. Mari tulis metode Java yang mengambil nomor urut planet (relatif terhadap jaraknya dari Matahari) dan mengembalikan komponen utama atmosfer planet sebagai List <String>. Anda akan ingat bahwa beberapa planet memiliki komposisi atmosfer yang serupa. Jadi, Venus dan Mars sebagian besar mengandung karbon dioksida; atmosfer Jupiter dan Saturnus terdiri dari hidrogen dan helium; dan Uranus dan Neptunus menambahkan metana ke 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;
}
Perhatikan bahwa kami menggunakan kode yang sama untuk planet dengan komposisi atmosfer yang identik. Kami melakukan ini dengan menggunakan pernyataan kasus berurutan . Jika kita ingin mendapatkan komposisi atmosfer planet asal kita, kita memanggil metode kita dengan argumen 3:

getPlanetAtmosphere(3).
System.out.println(getPlanetAtmosphere(3)) returns ["Carbon dioxide", "Nitrogen", "Oxygen"].
Eksperimen dengan break: Apa yang terjadi jika kita menghapus semua pernyataan break ? Mari kita coba:

    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 menemukan bahwa planet rumah kita tidak begitu layak huni. Atau itu? Nilai sendiri: ["Karbon dioksida", "Nitrogen", "Oksigen", "Hidrogen", "Helium", "Metana", "Hidrogen", "Helium"] . Kenapa ini terjadi? Program mengeksekusi semua pernyataan kasus setelah pertandingan pertama hingga akhir blok sakelar .

Optimalisasi pernyataan break yang berlebihan

Perhatikan bahwa kita dapat meningkatkan metode dengan menyusun pernyataan break dan case secara berbeda.

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;
}
Sepertinya lebih sedikit kode, bukan? Kami telah mengurangi jumlah total pernyataan dengan bermain-main dengan urutan pernyataan kasus dan mengelompokkannya kembali. Sekarang setiap jenis gas ditambahkan ke daftar hanya dalam satu baris kode. Kode yang diberikan pada contoh terakhir hanya untuk menunjukkan cara kerja sesuatu. Kami tidak menyarankan penulisan kode dengan cara ini. Jika pembuat kode Java tersebut (apalagi pemrogram lain) harus memeliharanya, dia akan merasa sangat sulit untuk merekonstruksi logika di balik pembentukan blok kasus tersebut dan kode yang dieksekusi dalam pernyataan switch .

Perbedaan dari jika

Mengingat kesamaan dari pernyataan if dan switch , jangan lupa bahwa pernyataan switch memilih salah satu kasus berdasarkan NILAI KHUSUS, sedangkan pernyataan if dapat memiliki ekspresi boolean. Ingatlah hal ini saat merancang kode Anda.

Kesimpulan

  • Gunakan pernyataan kasus untuk lebih dari dua cabang agar tidak mengacaukan kode Anda dengan pernyataan if.
  • Jangan lupa untuk menyelesaikan blok logis cabang untuk setiap nilai tertentu (pernyataan kasus) dengan menyisipkan pernyataan break .
  • Ekspresi pernyataan switch bisa berupa Enum atau String , serta beberapa tipe primitif.
  • Ingat blok default . Gunakan itu untuk menangani nilai tak terduga.
  • Untuk mengoptimalkan kinerja, pindahkan cabang kode yang sesuai dengan nilai paling umum ke awal blok sakelar .
  • Jangan terbawa dalam "optimasi" Anda dengan menghapus pernyataan break di akhir pernyataan kasus – kode seperti itu sulit dipahami, dan akibatnya, sulit dipertahankan.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION