Ketika saya mulai memprogram di Jawa, fakta bahwa pernyataan pergantian tidak mengambil string membuat saya frustrasi. Kemudian saat menggunakan Enums, saya menyadari manfaat yang Anda dapatkan dari mereka daripada membagikan nilai mentah - jenis keamanan (yang membawa refactoring lebih mudah) & juga kejelasan kepada pengembang lainnya.
Saya berjuang untuk memikirkan situasi di mana dengan SE7 sekarang saya akan memutuskan untuk menggunakan saklar dengan string sebagai input daripada Enums. Jika mereka diterapkan melalui pengaktifan seluruh string (mis. Daripada kecocokan sebagian atau regex), sepertinya tidak menawarkan alasan yang lebih sedikit untuk kode berubah.
Dan dengan alat IDE dan rasio baca-tulis dari pengkodean, saya akan jauh lebih bahagia secara otomatis menghasilkan Enum tambahan daripada membagikan nilai string.
Apa manfaatnya bagi kita sebagai programmer? Lebih sedikit boiler-plate?
Rasanya tidak seperti bahasa itu menangis untuk fitur ini. Meskipun mungkin ada case-use yang saya abaikan.
sumber
Jawaban:
Sejauh yang saya tahu, pertanyaannya adalah mengapa membungkus konstanta String ke enum belum dianggap cukup untuk memenuhi kebutuhan pengguna bahasa. Ini telah dibahas dalam proposal fitur resmi yang diumumkan di milis JDK 7 (proyek Coin).
Per saya membaca proposal, alternatif menggunakan enums telah diberhentikan dengan alasan bahwa itu memperkenalkan tipe mengasapi. Demi kenyamanan Anda, bagian yang relevan dari proposal dikutip di bawah ini, dengan pernyataan yang membahas enum dikutip dengan huruf tebal :
sumber
Selain membuat kode lebih mudah dibaca, ada potensi keuntungan kinerja relatif
if/else if
dibandingkan dengan perbandingan. Apakah perubahan itu bermanfaat tergantung pada berapa banyak perbandingan yang akan Anda buat. Sakelar string akan dikeluarkan sebagai dua instruksi sakelar terpisah. Yang pertama beroperasi pada kode hash, sehingga cenderung menjadilookupswitch
, pada akhirnya menghasilkanO(log n)
kompleksitas. Yang kedua selalu yang sempurnaO(1)
tableswitch
, jadi kompleksitas gabungannya tetapO(log n)
. Rantaiif/else if
pernyataan tunggal yang linear akan memberikanO(n)
kompleksitas yang sedikit lebih buruk .Jika Anda membandingkan lebih dari, katakanlah, tiga string, maka a
switch
mungkin lebih mudah dibaca dan kompak. Ini mungkin akan berkinerja lebih baik, meskipun Anda tidak mungkin melihat perbedaan kecuali Anda melakukan banyak perbandingan di jalur kode panas.sumber
if/else
praktik buruk yang besar , tetapi saat ini, saya tidak akan punya banyak alasan untuk menggunakannya.Switch for string dapat digunakan ketika
enum
nilai Anda berasal dari luar, yaitu disimpan dalam database.Hal penting lainnya dalam JDK 7
switch
adalah bahwa itu jauh lebih perfomant daripadaif-else
konstruksi.Dan kasus penggunaan yang bagus untuk string string cepat
switch
bisa JSON / XML stream parsing ketika Anda perlu membuat banyak switch pada node dan tipe atribut. Saya tidak bisa memikirkan opsi yang lebih baik untuk ini.sumber
enum
s dapat digunakan dalam kasus ini karena sifat statis Java. Ketika saya menulis ini, saya berpikir tentangRole
dari perpustakaan keamanan yang biasanya disediakan sebagai kelas dan tidak dapat dimasukkan ke dalamenum
. Kasus lain adalah kode Java / Groovy yang dikompilasi secara dinamis - dalam situasi ini, yang jarang terjadi, string switches mungkin merupakan opsi yang lebih baik.Kesederhanaan
Dukungan String in Switch berguna untuk memproses data tanpa konversi ke enum atau
if-else
logika. Terkadang lebih mudah untuk mengaktifkan String.Dari proposal fitur di mailing list JDK 7 (proyek Coin) ( jawaban @gnat )
Versi If-Else
Ini singkat, tetapi banyak
if's
yang sulit dibaca. Dan ini lambat.Versi Enum
Enum perlu didefinisikan, ini bagus, tetapi kadang tidak diperlukan.
Memproses seperti biasa
JDK 7 - String dalam versi Pernyataan beralih
Kami dapat memproses tanpa mengonversi dan menentukan jenis tambahan.
sumber
Sebagian besar perbaikan dalam bahasa apa pun adalah untuk membuat kode lebih mudah dibaca. Saya menyukai kode yang dapat dibaca daripada mewah setiap hari.
Anda mungkin tidak percaya ini, tetapi cobalah:
sumber
Enum itu bagus dan Anda harus menggunakannya daripada Strings ketika Anda memiliki kemampuan untuk melakukannya. Tetapi ada beberapa saat ketika Anda tidak bisa, misalnya ketika Anda perlu bekerja dengan beberapa objek eksternal yang berasal dari luar Jawa. Bayangkan Anda harus mengurai sesuatu. Seperti respons server, konfigurasi, file log atau yang serupa: Anda memiliki banyak opsi yang Anda cari dan tidak mungkin itu adalah enum. Jadi di Jawa <7 Anda akan terjebak dengan sekelompok
Anda masih dapat menggunakan enum dalam kasus ini dengan hanya mencoba mendapatkannya dengan nama dan / atau dengan memberikan rutin String-> Enum tetapi terkadang itu tidak mungkin atau tidak praktis (yaitu ketika Anda harus membuat terlalu banyak enum)
TLDR : Anda benar-benar harus menggunakan Enums ketika Anda bekerja murni dengan kode Java tetapi tidak selalu mungkin dengan objek eksternal. Saya harap penjelasan saya masuk akal.
sumber
if
pernyataan, maka Anda harus membungkus itu pula , yang berarti Anda masih bisa menggunakan enum, atau pola perintah, dllSaya tidak setuju dengan pendapat bahwa itu kode yang lebih bersih dan mudah dibaca ketika Anda menggunakan
Strings
dalam pernyataan switch dan berpikir bahwa ini adalah praktik pemrograman yang buruk. Jika Anda mengubah nilai yang Anda gunakan untuk menyimpan, Anda harus mengubahnya setiap switch atau jika-jika terjadi. Ini tidak baik karena Anda meletakkan nilai-nilai hardcoded ke setiap bir kode Anda. Apa yang akan Anda lakukan jika suatu hari Anda memutuskan untuk mengubah salah satu dari nilai-nilai ini? Cari dan ganti setiap salinannya?Jika Anda memiliki beberapa nilai hardcoded yang Anda lakukan jika-elseif pernyataan, menggunakan nilai-nilai primitif konstan untuk mereka jauh lebih baik sebelum Java 1.5 hanya karena membawa keamanan jenis.
OK, akan ada situasi Anda akan mendapatkan nilai-nilai String (dari Permintaan HTTP, file dll.) Dan mengonversinya menjadi nilai-nilai primitif adalah suatu rasa sakit. Tapi
Enum
s melakukan pekerjaan dengan baik pada saat ini. Karena ketika Anda ingin mengubah nilai yang Anda simpan di Enum, ubah saja ketika Anda menyatakan. Tidak perlu mengubah apa pun dalam kode Anda. (Anda tentu saja perlu mengubah nilai yang disimpan di tempat lain).Tentu saja jika Anda hanya menerapkan kode kotor dan malas, itu sempurna. Anda tidak ingin melibatkan banyak kode
Enum
, tetapi dalam perangkat lunak kompleks berskala besar yang akan membunuh Anda.sumber
Jika Anda tahu informasi apa yang masuk dan itu hanya bisa dari 5 negara maka gunakan
Enum
. Namun jika status yang memungkinkan bisa lebih dari 9000 dan Anda hanya perlu menemukan 42, maka menggunakan sakelar lebih baik karena Anda tidak ingin mengetikkan semua status tersebut.Sebuah Enum cenderung menjadi pilihan oleh sebagian besar di sebagian besar keadaan kecuali jika keadaan yang mungkin tidak diketahui atau ada banyak dan Anda hanya peduli sedikit.
Tapi mengapa mereka memperkenalkannya sekarang? Itu hanya perubahan yang memungkinkan kode bersih.
Dalam 1,5 mereka juga memungkinkan Anda untuk membuat badan kustom untuk Enums juga.
sumber
default
diswitch
datang untuk bermain. Saya tidak tahu bahwa Anda dapat memiliki status default denganEnum
, kecuali jika Anda membuat status default tetapi kemudian kode ini hanya membengkak sedangkan yangswitch
jauh lebih bersih untuk digunakan.UNKNOWN
keadaan pada Enum adalah mengasapi, tetapidefault
kasus pada sakelar tidak.