Pernyataan Suis: Bahaya Pemecahan Diabaikan
Di Java, pernyataan suis menyediakan cara yang mudah untuk mengendalikan berbilang pilihan kes. Walau bagaimanapun, meninggalkan kenyataan rehat boleh membawa kepada ralat halus dan tingkah laku yang tidak dijangka. Findbugs, alat analisis statik, membenderakan kejadian seperti itu, melaporkan ralat apabila satu kes "melewati" ke seterusnya.
Pertimbangkan kod berikut:
<code class="java">switch(x) { case 0: // code case 1: // code case 2: // code }</code>
Findbugs secara khusus menimbulkan ralat pada kenyataan kes kedua. Ini kerana, jika tiada pernyataan putus, pelaksanaan akan diteruskan kepada kes berikutnya selepas melaksanakan kod untuk kes semasa.
Untuk memahami tingkah laku ini dengan lebih baik, mari kita periksa contoh:
<code class="java">switch (foo) { case 0: doSomething(); case 1: doSomethingElse(); default: doSomeOtherThing(); }</code>
Jika foo ialah 0, ketiga-tiga fungsi doSomething, doSomethingElse dan doSomeOtherThing akan dilaksanakan dalam susunan tersebut. Walau bagaimanapun, jika foo ialah 1, hanya doSomethingElse dan doSomeOtherThing akan dijalankan. Tingkah laku ini mungkin tidak mencerminkan logik yang dimaksudkan.
Sebaliknya, menambah pernyataan putus pada setiap kes memastikan bahawa hanya fungsi yang dimaksudkan dilaksanakan:
<code class="java">switch (foo) { case 0: doSomething(); break; case 1: doSomethingElse(); break; default: doSomeOtherThing(); break; }</code>
Dalam kod ini, hanya satu fungsi akan dilaksanakan bergantung pada nilai foo.
Alat seperti bendera Findbugs mengetepikan rehat untuk menyerlahkan kemungkinan ralat dan memastikan gelagat yang dimaksudkan bagi pernyataan suis. Walau bagaimanapun, dalam kes tertentu, adalah boleh diterima untuk meninggalkan rehat apabila berbilang kes mewakili julat nilai yang bersebelahan dengan akibat yang sama:
<code class="java">switch (foo) { case 0: case 1: doSomething(); break; case 2: doSomethingElse(); break; default: doSomeOtherThing(); break; }</code>
Kod ini dengan sengaja memanggil doSomething apabila foo sama ada 0 atau 1. Kebanyakan alat analisis tidak akan melaporkan ini sebagai ralat kerana tiada kod perantara antara kes.
Atas ialah kandungan terperinci Mengapa Findbugs Menandakan Kenyataan Pecah Ditinggalkan dalam Pernyataan Suis Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!