Hanya mencoba mencari cara menggunakan banyak kasus untuk pernyataan switch Java. Inilah contoh dari apa yang saya coba lakukan:
switch (variable)
{
case 5..100:
doSomething();
break;
}
dibandingkan harus melakukan:
switch (variable)
{
case 5:
case 6:
etc.
case 100:
doSomething();
break;
}
Adakah ide jika ini memungkinkan, atau alternatif apa yang baik?
java
syntax
switch-statement
FunJavaCode
sumber
sumber
Jawaban:
Sayangnya, hal itu tidak mungkin dilakukan di Jawa. Anda harus menggunakan
if-else
pernyataan.sumber
if/elseif/else
pernyataan bersarang , terlepas dari bahasanya.Opsi kedua baik-baik saja. Saya tidak yakin mengapa seorang responden mengatakan itu tidak mungkin. Ini bagus, dan saya melakukan ini sepanjang waktu:
sumber
Di luar:
Src: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
sumber
Mungkin tidak seanggun beberapa jawaban sebelumnya, tetapi jika Anda ingin mendapatkan sakelar sakelar dengan beberapa rentang besar, cukup gabungkan rentang ke satu kasing sebelumnya:
sumber
case 1
berartivariable == 1
, yang menyebabkan kebingungan dan banyak rasa sakit dalam jangka panjang. Jika Anda perlu memberi komentar di kode Anda agar dapat dibaca, maka Anda melakukan kesalahan IMHO.Salah satu opsi Berorientasi Objek untuk menggantikan konstruksi
switch
danif/else
konstruksi yang terlalu besar adalah dengan menggunakan aChain of Responsibility Pattern
untuk memodelkan pengambilan keputusan.Pola Rantai Tanggung Jawab
Berikut adalah contoh implementasi yang juga Type Safe menggunakan Generik.
Ini hanya orang cepat yang saya siapkan dalam beberapa menit, implementasi yang lebih canggih mungkin memungkinkan beberapa jenis
Command Pattern
untuk disuntikkan ke dalamCase
contoh implementasi untuk membuatnya lebih seperti panggilan kembali gaya IoC.Setelah hal yang menyenangkan tentang pendekatan ini adalah bahwa pernyataan Switch / Case adalah tentang pengaruh samping, ini merangkum efek samping di Kelas sehingga dapat dikelola, dan digunakan kembali dengan lebih baik, akhirnya menjadi lebih seperti Pencocokan Pola dalam bahasa Fungsional dan itu bukanlah hal yang buruk.
Saya akan memposting pembaruan atau peningkatan apa pun ke Gist ini di Github.
sumber
Menurut pertanyaan ini , sangat mungkin.
Gabungkan saja semua kasus yang berisi logika yang sama, dan jangan letakkan di
break
belakangnya.Itu karena
case
tanpabreak
akan melompat ke yang laincase
sampaibreak
ataureturn
.EDIT:
Membalas komentar, jika kita benar-benar memiliki 95 nilai dengan logika yang sama, tetapi jumlah kasus yang jauh lebih kecil dengan logika berbeda, kita dapat melakukan:
Jika Anda membutuhkan kontrol yang lebih baik,
if-else
itu pilihannya.sumber
case
pernyataan!). Saya khawatir saya setuju dengan jawaban yang diterima.Pada dasarnya:
Jika Anda benar-benar perlu menggunakan sakelar, itu karena Anda perlu melakukan berbagai hal untuk rentang tertentu. Dalam hal ini, ya, Anda akan mendapatkan kode yang berantakan, karena hal-hal menjadi rumit dan hanya hal-hal yang mengikuti pola yang akan dikompres dengan baik.
Satu-satunya alasan pengalihan adalah untuk menghemat pengetikan nama variabel jika Anda hanya menguji nilai pengalihan numerik. Anda tidak akan mengaktifkan 100 hal, dan semuanya tidak akan melakukan hal yang sama. Kedengarannya lebih seperti potongan 'jika'.
sumber
// Contoh Kode yang Tidak Sesuai
// Solusi yang Sesuai
sumber
Dari rilis java-12 terakhir, beberapa konstanta dalam label kasus yang sama tersedia dalam fitur bahasa pratinjau
Sepertinya:
Lihat JEP 325 lainnya: Beralih Ekspresi (Pratinjau)
sumber
Hal ini dimungkinkan untuk menangani ini menggunakan perpustakaan Vavr
Hal ini tentunya hanya sedikit perbaikan karena semua kasus masih perlu dicantumkan secara eksplisit. Tetapi mudah untuk menentukan predikat khusus:
Kecocokan adalah ekspresi jadi di sini ia mengembalikan sesuatu seperti
Runnable
contoh alih-alih memanggil metode secara langsung. Setelah pertandingan dilakukanRunnable
dapat dieksekusi.Untuk detail lebih lanjut silakan lihat dokumentasi resmi .
sumber
untuk alternatif Anda bisa menggunakan seperti di bawah ini:
atau kode berikut juga berfungsi
sumber
JEP 354: Switch Expressions (Preview) di JDK-13 dan JEP 361: Switch Expressions (Standard) di JDK-14 akan memperluas pernyataan switch sehingga dapat digunakan sebagai ekspresi .
Sekarang kamu bisa:
case L ->
):Contoh ganti ekspresi:
sumber
Salah satu alternatif daripada menggunakan nilai hard-coded bisa menggunakan pemetaan jangkauan pada pernyataan switch sebagai gantinya:
sumber