Apa itu enum?
Enumeration adalah fitur baru yang diperkenalkan oleh JDK5. Dalam beberapa kasus, objek suatu kelas diperbaiki dan dapat didefinisikan sebagai enum. Dalam penggunaan aktual, jenis enumerasi juga dapat digunakan sebagai spesifikasi untuk memastikan keamanan parameter program. Pencacahan memiliki karakteristik berikut:
java.lang.Enum di java secara default, dan mengimplementasikan dua antarmuka: java.lang.Seriablizable dan java.lang.Comparable .public static final , dan kelas enumerasi non-abstrak tidak dapat memperoleh subkelas. Berikut ini equals() di kelas java.lang.Enum :
// Ini adalah final yang dimodifikasi, dan subclass tidak diizinkan untuk menulis ulang boolean final publik Equals (objek lainnya) {return this == lainnya;} Metode Umum untuk Pencacahan
int compareTo(E o)
Bandingkan urutan enum ini dengan objek yang ditentukan. Ketika objek kurang dari, sama dengan atau lebih besar dari objek yang ditentukan, bilangan bulat negatif, nol atau bilangan bulat positif masing -masing dikembalikan. Konstanta enumerasi hanya dapat dibandingkan dengan konstanta enumerasi lainnya dari tipe enum yang sama.
// Kode Sumber di Enum Public Final Int Compareto (E O) {enum Other = (enum) o; Enum self = ini; if (self.getClass ()! = Other.getClass () && // optimization self.getDeClaringClass ()! = Other.getDeclaringClass ()) lempar classcastException baru (); return self.ordinal - Other.ordinal;} String name()
Mengembalikan nama instance enum ini.
static values()
Mengembalikan array yang berisi semua nilai enum yang dapat digunakan untuk mengulangi semua nilai enum.
String toString()
Mengembalikan nama instance enum ini, yaitu nilai enum. Sama seperti name() .
// name () dan toString () di enum public string toString () {return name;} public final string name () {return name;} int ordinal()
Mengembalikan nilai indeks dari nilai enum di kelas enum (mulai dari 0), yaitu, urutan nilai enum dalam deklarasi enum, yang tergantung pada urutan deklarasi nilai enum.
<T extends Enum<T>> valueOf()
Mengembalikan konstanta enumerasi dari tipe enum yang ditentukan dengan nama yang ditentukan, nama harus persis cocok dengan pengidentifikasi yang digunakan untuk mendeklarasikan konstanta enumerasi dalam jenis ini (karakter spasi putih ekstra tidak diizinkan). Metode ini sesuai dengan ToString, jadi jika kita mengganti metode toString() , kita harus mengganti valueOf() metode (kita dapat mengganti metode toString() toString() , tetapi kita tidak dapat mengganti metode valueOf() valueOf() metode sendiri. Ketika kita tidak perlu membayar kembali.
Penerapan Pencacahan
Pencacahan adalah tipe khusus, dan penggunaannya sangat mirip dengan kelas biasa.
Ganti satu set konstanta
Warna enum publik {merah, hijau, kosong, kuning} Digunakan dalam pernyataan sakelar
// switch telah menambahkan dukungan untuk enum di jdk1.6 enum sinyal {green, yellow, red} ... switch (color) {case red: color = sinyal.green; merusak; } ... Tambahkan metode untuk enum
public enum color {red ("red"), green ("green"), blank ("white"), yello ("yellow"); // variabel anggota nama string pribadi; // Constructor Private Color (nama string) {this.name = name; } // Dapatkan set METODE PUBLIK PUBLIK GetName () {return name; } public void setName (name string) {this.name = name; }} Menerapkan antarmuka
perilaku antarmuka publik {void print (); } public enum warna mengimplementasikan perilaku {merah ("merah", 1), hijau ("hijau", 2), kosong ("putih", 3), yello ("kuning", 4); // Metode antarmuka @Override public void print () {System.out.println (this.index+":"+this.name); }} Kelas enumerasi yang mengandung metode abstrak
Operasi Enum Publik {// Digunakan untuk melakukan operasi tambahan plus {// Bagian kawat gigi sebenarnya adalah subclass internal anonim @Override Public Double Calculation (double x, double y) {return x + y; }}, // Digunakan untuk melakukan operasi pengurangan minus {// Bagian kawat gigi sebenarnya adalah subclass internal anonim @Override Public Double Calculation (double x, double y) {// TODO Metode yang dihasilkan otomatis Stub return x - y; }}, // Digunakan untuk melakukan operasi multiplikasi kali {// Bagian kawat gigi sebenarnya adalah subclass internal anonim @Override Public Double Calculation (double x, double y) {return x * y; }}, // Digunakan untuk melakukan operasi divisi divide {// Bagian kawat gigi keriting sebenarnya adalah subkelas internal anonim @Override public double countulasi (ganda x, double y) {return x / y; }}; // Tentukan metode abstrak untuk kelas enumerasi ini. Semua nilai enum di kelas enumerasi harus mengimplementasikan metode ini abstrak publik menghitung ganda (double x, double y);} Menerapkan singleton dengan enumerasi (praktik terbaik untuk singleton)
keuntungan:
1.Gunakan fitur enumerasi untuk mengimplementasikan kasus tunggal
2. JVM memastikan keamanan utas
3. Serangan serialisasi dan refleksi telah diselesaikan dengan enumerasi
publik enum singleton {instance; Publik singleton getInstance () {// Tambahkan metode ini untuk membuat orang lain memahami cara menggunakannya, karena metode implementasi ini relatif jarang. instance return; }} Penggunaan enumerasi lainnya
Enumset
range(E from, E to)
Dapatkan kisaran set dari nilai enum.
untuk (hari kerja minggu: enumset.range (weekdayenum.mon, weekdayenum.fri)) {System.out.println (hari); } of(E first, E... rest)
Membuat himpunan enumerasi yang awalnya berisi elemen yang ditentukan.
noneOf(Class<E> elementType)
Membuat set enumerasi kosong dengan jenis elemen yang ditentukan.
Enummap
EnumMap(Class<K> keyType)
Membuat peta enumerasi kosong dengan jenis kunci yang ditentukan.
Peta <Weather, String> enummap = Enummap baru <cuaca, string> (weather.class); enummap.put (cuaca.
Pencacahan di Android
Enum perlu menempati sejumlah besar memori. Jika peka terhadap memori, coba gunakan enum sesedikit mungkin dan ganti dengan konstanta statis.
Namun, jika Anda tidak menggunakan enumerasi, beberapa risiko keamanan akan muncul, sehingga pejabat telah meluncurkan dua anotasi, yang dapat tipe diperiksa selama periode kompilasi untuk menggantikan enumerasi. Dua anotasi ini adalah: @intdef dan @stringdef. Terletak di compile 'com.android.support:support-annotations :+'.
Contoh penggunaan
Penggunaan @stringdef konsisten dengan @IntDef. Di sini kami mengambil @intdef sebagai contoh.
antarmuka publik qrcodetype {int weChat = 0; int alipay = 1; @IntDef ({weChat, alipay}) @retention (retentionPolicy.source) @Target ({elementType.field, elementType.method, elementType.parameter}) @Interface checker {}} public class qrcode { @qrcodype.Checker {}} public class qrcode { @qrcodype.checker / public void setType (@qrcodetype.checker int type) {// Tentukan dalam parameter this.type = type; } @Qrcodetype.checker // Tentukan dalam metode (yaitu, periksa jenis nilai pengembalian) int getType publik () {tipe pengembalian; }} Rekomendasi untuk digunakan
Kisaran pengembangan yang paling banyak digunakan adalah menggunakan enumerasi alih -alih satu set konstanta statis. Dalam hal ini, metode anotasi di atas dapat digunakan sebagai gantinya.
Ketika enumerasi juga berisi fungsi lain (seperti: termasuk metode lain yang ditentukan), itu tidak dapat diganti.
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini akan membantu studi atau pekerjaan Anda. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi.