konsep
Nama lengkap enum adalah enumerasi, yang merupakan fitur baru yang diperkenalkan dalam JDK 1.5.
Di Java, tipe yang dimodifikasi oleh kata kunci enum adalah tipe enum. Bentuknya adalah sebagai berikut:
Enum Color {Red, Green, Blue}Jika enum tidak menambahkan metode apa pun, nilai enum default ke nilai yang dipesan mulai dari 0. Mengambil tipe enumerasi warna sebagai contoh, konstanta enumerasinya merah: 0, hijau: 1, dan biru: 2 secara berurutan
Manfaat Pencacahan: Konstanta dapat diatur dan dikelola dengan cara yang disatukan.
Skenario Aplikasi Khas untuk Pencacahan: Kode Kesalahan, Mesin Negara, dll.
Sifat jenis enumerasi
Meskipun enum terlihat seperti tipe data baru, pada kenyataannya, Enum adalah kelas terbatas dan memiliki metode sendiri.
Saat membuat enum, kompiler akan menghasilkan kelas terkait untuk Anda, yang diwarisi dari java.lang.Enum .
java.lang.Enum Deklarasi Kelas
Kelas abstrak publik enum <e memperluas enum <e>> mengimplementasikan yang sebanding <E>, serializable {...}Metode Pencacahan
Dalam enum, beberapa metode dasar disediakan:
values() : Mengembalikan array instance enum, dan elemen -elemen dalam array ini dipertahankan secara ketat dalam urutan yang dinyatakan dalam enum.
name() : Mengembalikan nama instance.
ordinal() : Mengembalikan urutan ketika instance dinyatakan, mulai dari 0.
getDeclaringClass() : Mengembalikan jenis enum yang menjadi milik instance.
equals() : Menentukan apakah itu objek yang sama.
Anda dapat menggunakan == untuk membandingkan instance enum .
Selain itu, java.lang.Enum mengimplementasikan antarmuka Comparable dan Serializable , sehingga metode compareto () juga disediakan.
Contoh: Metode Dasar Menampilkan Enum
kelas publik enummethoddemo {enum warna {merah, hijau, biru;} enum size {besar, tengah, kecil;} public static void main (string args []) {System.out.println ("====================== ====================================================================== UNTUK (Color C: Warna. System.out.println ("=============== Cetak semua ukuran ================================================= UNTUK (ukuran S: Ukuran.); S.)) {System.out.println (s +" ordinal ()) {System.out.println (s + "ordinal"); ordinal ()) {System.out.println (s + "ordinal") {System.out.println (s + (s + " Color.green; Color.green: " + green.equals (color.green)); System.out.println (" Green sama dengan size.middle: " + green.equals (size.middle)); System.out.println (" Green Equals 1: " + Green.Equals (1)); System.out.Format (" Green == Color.BLUE. }}Keluaran
==============================RED ordinal: 0GREEN ordinal: 1BLUE ordinal: 2=============== Print all Size ================BIG ordinal: 0MIDDLE ordinal: 1SMALL ordinal: 2green name(): GREENgreen getDeclaringClass (): kelas org.zp.javase.enumeration.enumdemo $ colorgreen hashCode (): 460141958green compareto color.green: 0green sama
Fitur Pencacahan
Karakteristik enumerasi disimpulkan dalam satu kalimat:
Selain tidak dapat mewarisi, enum pada dasarnya dapat dianggap sebagai kelas reguler.
Tetapi kalimat ini perlu dipahami secara terpisah, mari kita jelaskan secara rinci.
Pencacahan dapat menambah metode
Dalam bab konsep, nilai enum default ke nilai yang dipesan mulai dari 0. Kemudian pertanyaannya adalah: bagaimana menetapkan nilai ke enum yang ditampilkan.
Java tidak mengizinkan penggunaan = menetapkan nilai untuk enum konstanta
Jika Anda telah terpapar C/C ++, Anda pasti akan memikirkan simbol penugasan = secara alami. Dalam bahasa C/C ++, enum dapat ditugaskan untuk konstanta enum dengan simbol penugasan = ditampilkan; Namun, sayangnya, simbol penugasan = ditugaskan untuk konstanta enum tidak diizinkan dalam sintaks Java.
Contoh: Deklarasi Pencacahan dalam bahasa C/C ++
typedef enum {satu = 1, dua, tiga = 3, sepuluh = 10} angka;Enum dapat menambahkan metode biasa, metode statis, metode abstrak, dan metode konstruktor.
Meskipun Java tidak dapat secara langsung menetapkan nilai ke instance, ia memiliki solusi yang lebih baik: tambahkan metode untuk enum untuk secara tidak langsung menerapkan penugasan tampilan.
Saat membuat enum , Anda dapat menambahkan beberapa metode ke dalamnya, dan bahkan konstruktor untuk itu.
Catatan satu detail: Jika Anda ingin mendefinisikan metode untuk enum, Anda harus menambahkan titik koma di akhir contoh terakhir enum. Selain itu, dalam enum, instance harus didefinisikan terlebih dahulu, dan bidang atau metode tidak dapat didefinisikan sebelum instance. Jika tidak, kompiler akan melaporkan kesalahan.
Contoh: sepenuhnya menunjukkan cara mendefinisikan metode biasa, metode statis, metode abstrak, dan metode konstruksi dalam enumerasi
public enum errorCode {ok (0) {public String getDescription () {return "Success"; }}, Error_a (100) {public string getDescription () {return "error a"; }}, Error_b (200) {public string getDescription () {return "error b"; }}; Kode int pribadi; // Konstruktor: Konstruktor enum hanya dapat dinyatakan sebagai izin pribadi atau tidak menyatakan izin private errorCode (nomor int) {// konstruktor this.code = angka; } public int getCode () {// Kode pengembalian metode biasa; } // Metode Biasa Publik Abstrak String GetDescription (); // metode abstrak public static void main (string args []) {// metode statis untuk (errorCode s: errorCode.values ()) {System.out.println ("Code:" + s.getCode () + ", deskripsi:" + s.getDescription ()); }}}Catatan: Contoh di atas tidak disarankan, hanya untuk menunjukkan bahwa enumerasi mendukung definisi berbagai metode. Berikut adalah contoh yang disederhanakan
Contoh: Definisi Jenis Pencacahan Kode Kesalahan
Hasil eksekusi dari contoh ini dan contoh di atas persis sama.
public enum errorCodeen {ok (0, "Success"), error_a (100, "error a"), error_b (200, "error b"); ErrorCodeen (nomor int, deskripsi string) {this.code = angka; this.description = description; } kode int private; deskripsi string pribadi; public int getCode () {code return; } public String getDescription () {return description; } public static void main (string args []) {// Metode statis untuk (errorCodeEn S: errorCodeen.values ()) {System.out.println ("Code:" + s.getCode () + ", Deskripsi:" + s.getDescription ()); }}}Pencacahan dapat mengimplementasikan antarmuka
enum dapat mengimplementasikan antarmuka seperti kelas umum.
Ini juga mengimplementasikan kelas enumerasi kode kesalahan di bagian sebelumnya. Dengan mengimplementasikan antarmuka, ia dapat membatasi metodenya.
antarmuka publik inumberenum {int getCode (); String getDescription ();} public enum errorCodeEn2 mengimplementasikan inumberenum {ok (0, "Success"), error_a (100, "error a"), error_b (200, "error b"); ErrorCodeEn2 (nomor int, deskripsi string) {this.code = angka; this.description = description; } kode int private; deskripsi string pribadi; @Override public int getCode () {code return; } @Override Public String getDescription () {return description; }}Pencacahan tidak dapat diwariskan
Enum tidak dapat mewarisi kelas lain, dan tentu saja, itu tidak dapat mewarisi enum lain.
Karena enum sebenarnya diwarisi dari kelas java.lang.Enum , dan Java tidak mendukung banyak warisan, enum tidak dapat mewarisi kelas lain, dan tentu saja tidak dapat mewarisi enum lain.
Skenario aplikasi yang disebutkan
Mengatur konstanta
Sebelum JDK1.5, definisi konstanta di Java adalah public static final TYPE a ; dalam bentuk ini. Dengan enumerasi, Anda dapat mengatur konstanta asosiasi untuk membuat kode lebih mudah dibaca dan aman, dan juga menggunakan metode yang disediakan oleh enumerasi.
Format Deklarasi Pencacahan
Catatan: Jika tidak ada metode yang ditentukan dalam enum, Anda juga dapat menambahkan koma, titik koma atau tidak sama sekali setelah contoh terakhir.
Tiga metode deklarasi berikut setara:
Enum Color {Red, Green, Blue} Enum Color {Red, Green, Blue,} Enum Color {Red, Green, Blue; }Switch State Machine
Kami sering menggunakan pernyataan sakelar untuk menulis mesin negara. Setelah JDK7, Switch memiliki parameter yang didukung dari jenis int、char、String、enum . Dibandingkan dengan jenis parameter ini, kode sakelar menggunakan enumerasi lebih mudah dibaca.
enum sinyal {merah, kuning, hijau} string statis public getTrafficInstruct (sinyal sinyal) {string instruk = "kegagalan cahaya sinyal"; switch (sinyal) {case red: Instruce = "Red Light Stop"; merusak; Case Yellow: Instruct = "Harap Perhatikan Lampu Kuning"; merusak; case green: instruk = "garis lampu hijau"; merusak; default: break; } return instruce;}Mengatur enumerasi
Pencacahan jenis serupa dapat diatur melalui antarmuka atau kelas.
Namun, ini umumnya diatur oleh antarmuka.
Alasannya adalah: Antarmuka Java akan secara otomatis menambahkan pengubah public static ke jenis enum saat menyusun; Kelas Java akan secara otomatis menambahkan pengubah static ke jenis enum saat menyusun. Pernahkah Anda melihat perbedaannya? Itu benar, yaitu, mengatur enum di kelas. Jika Anda tidak memodifikasinya ke public , Anda hanya dapat mengaksesnya di paket ini.
Contoh: Atur enum di antarmuka
Tanaman Antarmuka Publik {enum sayuran mengimplementasikan inumberenum {kentang (0, "kentang"), tomat (0, "tomat"); Sayuran (nomor int, deskripsi string) {this.code = angka; this.description = description; } kode int private; deskripsi string pribadi; @Override public int getCode () {return 0; } @Override Public String getDescription () {return null; }} Enum buah mengimplementasikan inumberenum {apel (0, "apel"), oranye (0, "oranye"), pisang (0, "pisang"); Buah (nomor int, deskripsi string) {this.code = angka; this.description = description; } kode int private; deskripsi string pribadi; @Override public int getCode () {return 0; } @Override Public String getDescription () {return null; }}}Contoh: Atur enum di kelas
Contoh ini memiliki efek yang sama dengan contoh sebelumnya.
PLANT CLASS PUBLIK2 {Publik enum sayuran mengimplementasikan inumberenum {...} // hilangkan kode encer public enum mengimplementasikan inumberenum {...} // hilangkan kode}Pencacahan strategi
Pencacahan strategi ditampilkan dalam Java yang efektif. Pencacahan ini mengklasifikasikan konstanta enum dengan enumerasi enumerasi bersarang.
Meskipun pendekatan ini tidak ringkas seperti pernyataan sakelar, lebih aman dan lebih fleksibel.
Contoh: Contoh Pencacahan Kebijakan di EffectViejava
Enum Payrollday {Senin (paytype.weekday), Selasa (paytype.weekday), Rabu (paytype.weekday), Kamis (paytype.weekday), Jumat (paytype.weekday), Sabtu (paytype.weekend), Minggu (paytype.weekend); paytype paytype final swasta; Payrollday (paytype paytype) {this.paytype = paytype; } ganda gaji (jam dua jam, payrate ganda) {return paytype.pay (hoursworked, payrate); } // kebijakan enum private enum paytype {Weekday {ganda overMePay (jam ganda, ganda payrate) {jam kembali <= jam_per_shift? 0: (jam - jam_per_shift) * payrate / 2; }}, Akhir pekan {ganda overimepay (jam ganda, ganda payrate) {jam kembali * payrate / 2; }}; private static final int hours_per_shift = 8; abstrak ganda overimepay (jam ganda, ganda payrate); gaji ganda (jam dua jam, payrate ganda) {double basepay = hoursworked * payrate; pengembalian basepay + overimepay (jam kerja, payrate); }}}tes
System.out.println ("Penghasilan untuk Orang yang Mendapatkan 100 Upah per jam pada hari Jumat selama 8 jam:" + Payrollday.Friday.pay (8.0, 100)); System.out.println ("Penghasilan untuk Orang yang Mendapatkan 100 Upah per jam pada hari Sabtu selama 8 jam:" + Payrollday.saturday.pay (8.0, 100));Enumset dan enummap
Java menyediakan dua kelas alat yang nyaman untuk mengoperasikan enum - enumset dan enummap.
EnumSet adalah implementasi Set kinerja tinggi dari jenis enum. Ini mensyaratkan bahwa konstanta enum yang ditempatkan di dalamnya harus termasuk jenis enum yang sama.
EnumMap adalah implementasi peta yang disesuaikan untuk jenis enum. Meskipun menggunakan implementasi Map lainnya (seperti HashMap) juga dapat menyelesaikan instance jenis enum untuk menilai pemetaan, menggunakan ENUMMAP lebih efisien: ia hanya dapat menerima contoh dari jenis enum yang sama dengan nilai -nilai kunci, dan karena jumlah instance jenis enum relatif tetap dan terbatas, Enumumap menggunakan array untuk menyimpan nilai yang sesuai dengan tipe ENUM. Ini membuat Enumumap sangat efisien.
// Penggunaan enumset system.out.println ("Enumset Display"); enumset <cerrorCodeen> errset = enumset.allof (errorCodeen.class); for (errorCodeen e: errset) {system.out.println (e.name () + ":" + e.ordinal ());} // Penggunaan enummap system.out.println ("Enumumpen Display"); enumumap <statemachine.signal, string> errmap = baru Enummap (statemachine.signal.class); errmap.put (statemachine.signal.red, "lampu merah"); errmap.put (statemachine.signal.yellow, "yellow"); errmap.put (statemachine.signal.green, "lampu hijau"); untuk (iteroror <papach. errmap.entryset (). iterator (); System.out.println (entry.getKey (). Name () + ":" + Entry.getValue ());}Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.