Tentang enumerasi
Sebagian besar enum yang ditulis di tempat -tempat diberikan enum dan kemudian contoh mulai beralih. Tetapi saya ingin mengatakan bahwa data dari kode saya tidak mungkin enum, biasanya string atau angka. Misalnya, setelah mem -parsing SQL, pertama -tama saya menentukan tipe SQL. Dengan mencegat token SQL, intersep dapat dipilih, menghapus, memperbarui, memasukkan, mengubah, dll., Tetapi mereka semua adalah string. Saat ini, saya ingin menggunakan enum, tetapi saya tidak bisa melakukannya. Bagaimana cara mengubah string menjadi enum? Situasi serupa termasuk mengambil data dari database dan membuat penilaian berdasarkan beberapa jenis, menyampaikan data dari halaman, dan melakukan operasi yang berbeda sesuai dengan jenis yang berbeda, tetapi mereka semua adalah string, bukan enum. Tragedi adalah bahwa saya jarang melihat siapa pun yang menulis hal ini; Jadi saya menuliskannya, berharap seseorang dapat menggunakannya.
Pertama -tama, mengapa menggunakan enumerasi? Kapan lebih baik menggunakan enum? Apa keuntungan menggunakan enum?
Saya pikir ketika Anda berada di beberapa kelas kategori dan dapat menghitung dan tidak berubah jenis untuk memandu program untuk merutekan ke tempat yang berbeda, menggunakan enumerasi adalah pilihan yang lebih baik;
Kedengarannya agak membingungkan, tetapi ada contoh yang mungkin dipahami, misalnya:
Kami dapat mencantumkan hal -hal yang kami lakukan pada hari -hari kerja sehari -hari kami:
Pergi bekerja, mengadakan pertemuan, makan, tidur, dll.
Kami dapat mendaftar bagian -bagian yang perlu diperiksa oleh departemen THT rumah sakit:
Mata, hidung, telinga, mulut, dll.
Ini dapat disebutkan, dan kita harus melakukan masing -masing dengan cara yang berbeda;
Tentu saja Anda bisa mengatakan:
1. Ini dapat dikirim secara dinamis melalui file konfigurasi atau anotasi;
2. Konstanta dapat digunakan untuk mencapai efek yang sama;
3. Ekspresikan langsung melalui setara dengan string, dan ungkapkan dengan jika yang lain
Jika Anda menggunakan metode penambahan konfigurasi untuk mengirimnya, itu fleksibel dan mudah dimodifikasi; Tetapi jika kami menggunakan banyak parameter yang tidak sering dimodifikasi, kami sering meningkatkan beban konfigurasi, dan ketika Anda perlu membaca logika sistem, Anda perlu membaca konfigurasi dan kode lagi; Namun, jika parameternya adalah informasi yang dapat ditransformasikan secara dinamis, menggunakan konfigurasi adalah pilihan yang benar;
Penggunaan konstanta biasanya angka saat beralih casing, dan string tidak dapat beralih kasus di Java. Tujuan menggunakan konstanta meningkatkan keterbacaan daripada Kasus 1 dan Kasus 2 ... tetapi data string juga merepotkan. Kecuali dipetakan lagi, tidak perlu. Faktanya, enumerasi hampir dipetakan untuk Anda sekali, tetapi hanya merangkum kode. Karena telah dilakukan dan didukung secara sintaksis, mengapa tidak menggunakannya! Kedua, meskipun konstanta meningkatkan keterbacaan, mereka tidak memiliki konsep kategori dan tipe manajemen. Artinya, definisi enum mendefinisikan kategori, yang dapat mencantumkan hal -hal yang diperlukan untuk rentang ini dengan baik. Konstanta biasanya beberapa kolam yang ditentukan sendiri, ditempatkan di beberapa kelas publik atau didefinisikan secara acak, dan relatif tersebar. Selain itu, enum didefinisikan dengan jelas saat beralih, dan kasingnya berada dalam kisaran enumerasi kunci. Ia tidak hanya dapat mengontrol sistem, meningkatkan keterbacaan, tetapi juga memeriksa informasi yang enum dalam kategori ini kapan saja, untuk mencapai fungsi melihat file konfigurasi; Tetapi masih kembali dalam kalimat itu, jika parameternya bervariasi, maka itu tidak cocok untuk enumerasi. Pencacahan harus dihitung, atau pertimbangan sistem saat ini dapat disebutkan. Misalnya, mungkin ada banyak rumah sakit di rumah sakit di atas, tetapi rumah sakit saat ini hanya memproses beberapa bagian dan tidak memproses orang lain. Inilah alasannya. Apa itu variabel? Misalnya, parameter URL dikirim ke metode yang sesuai. Tidak mungkin bagi semua orang untuk menambahkan sepotong logika dan menambahkan enumerator dan kasing. Pada saat ini, lebih baik menggunakan [konfigurasi + pengiriman metode dinamis]. Tentu saja, konfigurasi bisa hanya file atau anotasi.
Yang paling pedesaan adalah menggunakan string yang sama untuk mengimplementasikannya dengan jika lain. Haha, tidak ada yang salah dengan ini, tetapi ini ditulis dengan cara yang tersebar. Kedua, setiap pencocokan yang sama perlu dibandingkan dengan setiap karakter setiap kali Anda mencocokkan setara. Jika Anda banyak mengulangi kode Anda, kinerjanya tidak terlalu bagus, dan sisanya akan lebih jelas setelah melihat deskripsi di atas;
Kedua, enumerasi menyediakan komponen manajemen jenis, membuat sistem berorientasi objek lebih sempurna, sehingga beberapa jenis manajemen dapat dikonfigurasi dan dikelola. Di mana pencacahan digunakan, Anda dapat menemukan definisi enumerasi yang telah diproses dan belum diproses, dan di atas sulit dicapai; Misalnya, ada 10 jenis jenis operasi yang ditentukan dalam database, jadi dalam proses penentuan, enumerasi dapat dilihat seperti file konfigurasi, dan sangat mudah dikelola.
Akhirnya, pencacahan benar -benar singleton, dan kinerja perbandingan sebanding dengan kinerja digital, yang dapat memperoleh keterbacaan dan kinerja.
Penggunaan dasar jenis enum
Dengan dasar teoretis seperti itu, mari kita lihat jenis enum enum di java:
1. Anda dapat menambahkan variabel dan metode untuk enum
Mari kita lihat contoh kode:
status enum publik {normal ("normal", 1), update ("diperbarui", 2), dihapus ("dihapus", 3), dipecat ("bertopeng", 4); // variabel anggota nama string pribadi; indeks int pribadi; // Metode Konstruksi, Catatan: Konstruktor tidak dapat bersifat publik, karena enum tidak dapat dipakai secara pribadi (nama string, indeks int) {this.name = name; this.index = index; } // Metode normal public static string getName (int index) {for (state c: state .values ()) {if (c.getIndex () == index) {return c.name; }} return null; } // Dapatkan set METODE PUBLIK PUBLIK GetName () {return name; } public void setName (name string) {this.name = name; } public int getIndex () {return index; } public void setIndex (int index) {this.index = index; }}Dari kode di atas, kita dapat melihat bahwa setelah mendefinisikan nilai enum, kemudian menambahkan titik koma ke dalamnya, dan kemudian Anda dapat mendefinisikan variabel dan metode lain. Perlu dicatat secara khusus bahwa metode konstruksi dalam enum tidak dapat diidentifikasi oleh publik, jadi ini dilakukan untuk mencegah pengguna instantiasi enum.
2. Dapat digunakan untuk mendefinisikan konstanta
Mari kita tinjau bagaimana mendefinisikan konstanta di Java, dan lihat kode berikut:
public static final int normalState = 1; private static final int updatestate = 2;
Di bawah ini kita juga dapat menggunakan enum enum untuk mengganti definisi konstan di atas, kode ini adalah sebagai berikut:
status enum publik {normal, perbarui, dihapus, dipecat}Tidak ada keunggulan sintaks dalam menggunakan enum untuk mendefinisikan konstanta di java, tetapi jenis enum enum dapat memberikan fungsi yang lebih operasional.
3. Menerapkan antarmuka di enum
Pertama -tama mari kita lihat kode berikut:
antarmuka publik IcanreadState {void read (); String getState ();} Public Enum State mengimplementasikan IcanReadState {Normal ("Normal", 1), Update ("Diperbarui", 2), Dihapus ("Dihapus", 3), dipecat ("bertopeng", 4); nama string pribadi; indeks int pribadi; private state (nama string, index int) {this.name = name; this.index = index; } // Metode antarmuka 1 @Override Public String getState () {return this.name; } // Metode antarmuka 2 @Override public void read () {System.out.println (this.index + ":" + this.name); }}Sama seperti menggunakan antarmuka di kelas umum, enum enum juga dapat mewarisi antarmuka dan mengimplementasikan semua metode dalam antarmuka. Keuntungan dari ini adalah bahwa ia dapat lebih mudah mengurutkan, membandingkan dan operasi lain pada nilai -nilai dalam enum, dan memiliki enkapsulasi yang lebih baik.
Contoh
Pertama -tama mari kita tentukan enum sederhana (ini hanya contoh, jadi kita hanya akan mendefinisikan 3 variabel):
Publik enum sqltypeenum {masukkan, perbarui, hapus, pilih}Setelah parsing SQL, token diperoleh. Bagaimana kita mendapatkan penghitungan token ini?
Dapatkan seperti ini:
String token = "select"; sqltypeenum sqltypeenum = sqltypeenum.valueof (token.tuppercase ());
Jika tidak diperoleh, Java akan melempar pengecualian: ilegalargumentException no enum const class sqltypeenum.xxx
Alasan saya melakukan kapitalisasi adalah karena enum juga dikapitalisasi (tentu saja, jika enum Anda adalah huruf kecil, maka Anda adalah huruf kecil, tetapi lebih merepotkan untuk mencampurnya). Faktanya, nilai memanggil pemetaan yang mendasari enum:
Metode ini akan dipanggil saat menelepon:
Jadi ada juga hashmap di dalam, haha!
Setelah mendapatkan informasi ini, Anda dapat melakukan operasi yang diinginkan:
sakelar (sqltypeenum) {case sisipkan: menangani logika insert; merusak; Hapus kasus: menangani logika hapus; merusak; ....}Ok, kadang -kadang kita mungkin tidak ingin menggunakan string seperti memasukkan atau memperbarui secara langsung dalam interaksi, karena berkali -kali spesifikasi penamaan diperlukan;
Misalnya, tentukan beberapa jenis tindakan pengguna:
1. Simpan informasi pengguna
2. Dapatkan informasi pengguna dasar melalui ID
3. Dapatkan daftar pengguna
4. Hapus informasi pengguna melalui ID
dll.
Kami dapat mendefinisikan enumerasi sebagai:
PUBLIK ENUM USEROPTIONENUM {save_user, get_user_by_id, get_user_list, delete_user_by_id}Namun, metode sistem dan beberapa konfigurasi kata kunci biasanya ditulis sebagai:
SaveUser, getUserbyId, getUserbyId, deleteUserbyId
Tentu saja, masing -masing memiliki aturannya sendiri, tetapi jika Anda tidak ingin melakukan pemetaan di tengah, Anda hanya berkompromi di atasnya. Baik mengganti semua nama enum, yang tampaknya cukup aneh, atau mengganti semua nama metode, yang bahkan lebih aneh, atau Anda dapat melakukan pemetaan sendiri. Oke, ini sedikit lebih merepotkan, tetapi sebenarnya tidak merepotkan?
Pertama-tama mari kita tulis metode untuk mengonversi data gaya bawah yang disebutkan ke unta dan masukkan ke dalam stringutils:
string public static convertDbstyletojavastyle (string dbstyleString, boolean firstupper) {dbstyleString = dbstyleString.tolowercase (); String [] tokens = dbstyleString.split ("_"); StringBuilder StringBuilder = StringBuilder baru (128); panjang int = 0; untuk (token string: token) {if (stringutils.isnotblank (token)) {if (length == 0 &&! firstupper) {stringBuilder.append (token); } else {char c = token.charat (0); if (c> = 'a' || c <= 'z') c = (char) (c - 32); StringBuilder.append (c); StringBuilder.append (token.substring (1)); }} ++ panjang; } return stringBuilder.toString (); }Kelebihan Metode:
string statis public convertDbstyletoJavalocalstyle (string dbstyleString) {return convertDbstyletoJavastyle (dbstyleString, false); }Kemudian tentukan enum:
Public Enum UserOptionEnum {save_user, get_user_by_id, get_user_list, delete_user_by_id; peta statis akhir pribadi <string, useroptioneNum> enum_map = hashmap baru <string, useroptioneNum> (64); static {for (userOptionEnum v: values ()) {enum_map.put (v.toString (), v); }} public staticUserOptionenum fromString (string v) {userOptionEnum userOptionEnenum = enum_map.get (v); return useroptionenum == null? Default: useroptionenum; } public String ToString () {String StringValue = Super.ToString (); return stringutil.convertdbstyletoJavalocalstyle (stringValue); }}Oke, lulus parameter acara seperti ini sehingga jika itu: saveUser, gunakan:
String event = "saveUser"; // Jika Anda mendapatkan parameter useroptionenum enum = userOptionEnum.fromString (event);
Bahkan, saya membuat hashmap sendiri, dan saya menambahkan fromstring karena ada beberapa batasan enumerasi dan beberapa metode tidak memungkinkan Anda untuk menimpa, seperti metode nilai.
Sebenarnya, tidak ada yang bisa dikatakan. Mari kita bicara tentang menambahkan beberapa variabel khusus untuk enum. Bahkan, kecuali untuk menjadi singleton, enum lainnya mirip dengan kelas biasa. Mereka juga dapat memiliki metode konstruktor, tetapi tidak secara default. Mereka juga dapat memberikan variabel khusus dan kemudian mendapatkan set dan mendapatkan metode. Namun, jika ada yang ditetapkan, utasnya tidak aman, jadi perhatikan poin ini; Jadi metode konstruksi umumnya ditulis:
Publik enum sqltypeenum {insert ("masukkan ke"), hapus ("hapus dari") ...... dihilangkan; private string name; // tentukan variabel khusus sqltypeenum (nama string) {this.name = name; } public string getName () {return name; } public String toString () {return name + "i Dash"; // Tulis ulang metode ToString} // umumnya tidak disarankan public void setName (nama string) {this.name = name; }}Ditelepon:
Sqltypeenum sqltypeenum = sqltypeenum.valueof ("masukkan"); System.out.println (sqltypeenum); System.out.println (sqltypeenum.getname ());Tidak disarankan untuk menyebutnya:
sqltypeenum.setname ("sialan");Di utas lain:
Sqltypeenum sqltypeenum = sqltypeenum.valueof ("masukkan"); System.out.println (sqltypeenum); System.out.println (sqltypeenum.getname ());Saya menemukan bahwa hasilnya diubah, haha!