Enumset
Enumset adalah wadah generik dari jenis java enum. Karena Java telah mengurutkan, Treeset, Hashset dan wadah lainnya, mengapa perlu enumset tambahan <T>? Jawabannya adalah bahwa Enumset memiliki karakteristik tertentu. Misalnya, enumset sangat cepat. Lagipula, saya tidak akan mencantumkan fitur lain satu per satu, konten artikel ini tidak memperkenalkan fitur enumset.
Kelas koleksi yang dirancang khusus untuk kelas enumerasi, semua elemen harus jenis enumerasi
Elemen yang ditetapkan enumset dipesan dan disimpan secara internal oleh vektor bit, sehingga mereka menempati lebih sedikit memori dan memiliki efisiensi tinggi.
Elemen nol tidak diperbolehkan
Kode Sumber
Paket java.util; impor sun.misc.sharedsecrets; kelas abstrak publik enumset <e memperluas enum <e>> memperluas abstrak abstrak <e> mengimplementasikan kloning, java.io.serializable { / *** jenis elemen* / kelas akhir <e> elementType; / *** elemen toko melalui array*/ final enum [] alam semesta; private static enum [] zero_length_enum_array = enum baru [0]; Enumset (kelas <E> elementType, enum [] Universe) {this.elementType = elementType; this.universe = alam semesta; }/** * Buat set enum kosong dan rumuskan tipe elemennya * @param elementType objek kelas dari jenis elemen untuk enum ini * set * @throws nullpointException jika <tt> elementType </tt> adalah null */public static <e enum <e> enceSet </e no> nol (class <e> element) {enum {enumset <e no> nol (class) (e enum) {enumset <E no> nol (class <e> {ENUMETETE/ENUMSET <E no8 if (universe == null) lempar classcastException baru (elementType + "bukan enum"); if (universe.length <= 64) mengembalikan RegulerEnumset baru <> (ElementType, Universe); lain mengembalikan Jumboenumset baru <> (ElementType, Universe); } /** * Create an enum containing all elements in the specified element type set * * @param elementType the class object of the element type for this enum * set * @throws NullPointerException if <tt>elementType</tt> is null */ public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType) { EnumSet<E> result = NoneOf (ElementType); result.addall (); hasil pengembalian; } /** * Menambahkan semua elemen dari jenis enum yang sesuai ke set enum * ini, yang kosong sebelum panggilan. */ abstrak void addall (); /** * Buat set enum dengan jenis elemen yang sama dengan set enum yang ditentukan * * @param s Set enum untuk menginisialisasi set enum ini * @Throws nullpointException jika <tt> s </tt> adalah null */public static <e enum <e> {ENMETLE (ENUMSET (ENUMSET (ENUMSET <E> {ENUMSET (E ENUMSET (E ENUMSET (ENUMSET (E ENUMSET (ENUMSET (ENUMSET (ENUMSET (ENUMSET (E ENUMSET <E). }/** * Buat set enum dari mana untuk menginisialisasi set enum ini * @throws IllegalArgumentException jika <tt> C </tt> bukan instance * <tt> enumset </tt> instance dan tidak ada elemen * @throws nullpointException jika <tt> c </tt> adalah null * @throws nullpointException if <tt> c </tt> adalah null * @throws nullpointException jika <t tt> c </tt> adalah null * @throws nullpointException if <tt> c </tt> adalah null * @throws nullpointException if <tt> copyOf (koleksi <E> c) {if (c instance dari enumset) {return ((enumset <E>) c) .clone (); } else {if (c.isempty ()) melempar IllegalArgumentException baru ("koleksi kosong"); Iterator <E> i = c.iterator (); E pertama = i.next (); Enumset <e> result = enumset.of (pertama); while (i.hasnext ()) result.add (i.next ()); hasil pengembalian; }}/** * Buat set enum dari yang pelengkapnya untuk menginisialisasi set enum ini * @throws nullpointerException jika <tt> s </tt> adalah null */public static <e memperluas enum <e>> enumset <e> komplemen (enumset <e> s) {enumset <e> result = copyof (s); result. Plement (); hasil pengembalian; }/** * 1 Koleksi enumerasi elemen * * @param e Elemen yang ditetapkan oleh set ini pada awalnya * @throws nullpointerexception jika <Tt> e </tt> adalah null * @return, set enum yang awalnya berisi (e e) {extends Extends <e> <e> <e >> enumset <e> dari (e e) {extends {e enumset <e> <e>> enumset <e> dari (e e) {extends {e enumset <e>> enumset <e> dari (e e) NoneOf (E.GetDeclaringClass ()); result.add (e); hasil pengembalian; } / ** * 2 Koleksi enumerasi elemen * * @param e1 elemen yang ditetapkan oleh set ini pada awalnya * @param e2 elemen lain yang set ini mengandung awalnya * @throws nullpointerexception jika ada parameter yang null * @return dan enum yang awalnya mengandung elemen yang ditentukan * / public static <e extends <e enum {e e {e -{e e -{e e enum {e e enum {e e enum {e e enum {e e enum. Enumset <e> hasil = noneof (e1.getDeclaringclass ()); result.add (e1); result.add (e2); hasil pengembalian; } / ** * 3 Koleksi enumerasi elemen * * @param e1 elemen yang akan dikandung pada awalnya * @param e2 elemen lain yang set ini mengandung awalnya * @param e3 elemen lain yang ditetapkan oleh set ini. dari (e e1, e e2, e e3) {enumset <e> result = noneof (e1.getDeclaringClass ()); result.add (e1); result.add (e2); result.add (e3); hasil pengembalian; } / ** * 4 elemen enumeration set * @param e1 elemen yang ditetapkan set ini pada awalnya * @param e2 elemen lain yang set ini berisi * @param e3 elemen lain yang diatur pada awalnya. <E extends enum <e>> enumset <e> dari (e e1, e e2, e e3, e e4) {enumset <e> hasil = tidak ada (e1.getDeclaringclass ()); result.add (e1); result.add (e2); result.add (e3); result.add (e4); hasil pengembalian; } /** * 5 Koleksi enumerasi elemen * * @param e1 Sebuah elemen yang akan dikandung pada awalnya * @param e2 elemen lain yang set ini berisi * @param e3 elemen lain yang ditetapkan ini pada awalnya * @param e4 @non -non -non -non -non -null. set enum awalnya berisi elemen yang ditentukan */ statis publik <e memperluas enum <e>> enumset <e> dari (E e1, e e2, e e3, e e4, e e5) {enumset <e> hasil = noneof (e1.getdeclaringclass ()); result.add (e1); result.add (e2); result.add (e3); result.add (e4); result.add (e5); hasil pengembalian; }/** * n * * @param Pertama elemen yang ditetapkan set awalnya * @param beristirahat elemen yang tersisa. Set awalnya berisi * @Throws nullpointerException jika ada elemen yang ditentukan yang ditetapkan nol, atau jika <tt> sandaran @ Enum <e>> enumset <E> dari (e pertama, e ... istirahat) {enumset <e> result = noneof (first.getDeclaringclass ()); result.add (pertama); untuk (e e: istirahat) result.add (e); hasil pengembalian; } /** * Koleksi elemen yang disebutkan dalam kisaran * @param dari elemen pertama dalam kisaran * @param ke elemen terakhir dalam kisaran * @throws nullpointException jika {@code dari} atau {@code ke @null * @throws 0 @rows @@rows ke @ @@throws @ @ @ @@code @ @@code Elemen -elemen dalam rentang * yang ditentukan oleh dua titik akhir yang ditentukan */ statis publik <e memperluas enum <e>> enumset <E> rentang (e dari, e to) {if (dari.comppareto (to)> 0) melempar baru ilegalargumentException (dari + ">" + to); Enumset <E> hasil = noneof (from.getDeclaringClass ()); result.addrange (dari, ke); hasil pengembalian; } /** * Menambahkan rentang yang ditentukan ke set enum ini, yang kosong sebelum * ke panggilan. */ abstrak void addrange (e from, e to); /*** Mengembalikan salinan set ini. * * @return Salinan set ini */ enumset publik <E> clone () {coba {return (enumset <E>) super.clone (); } catch (clonenotsupportedException e) {lempar new assertioneRror (e); }} /*** Lengkapi konten dari set enum ini. */ abstrak void komplemen (); /*** melempar pengecualian jika E tidak dari jenis yang benar untuk set enum ini. */ final void typeCheck (e e) {class eclass = e.getClass (); if (eclass! = elementType && eclass.getSuperclass ()! = elementType) lempar classcastException baru (eclass + "! =" + elementType); } /** * Mengembalikan semua nilai yang terdiri dari E. * Hasilnya tidak dikloning, di -cache, dan dibagikan oleh semua penelepon. */ private static <e memperluas enum <e>> e [] getUniverse (class <e> elementType) {return sharedsecrets.getjavalangAccess () .getEnumConstantsshared (elementType); } /** * Kelas ini digunakan untuk membuat serialisasi semua instance enumset, terlepas dari * jenis implementasi. Ini menangkap "konten logis" mereka dan mereka * direkonstruksi menggunakan pabrik statis publik. Ini diperlukan * untuk memastikan bahwa keberadaan jenis implementasi tertentu adalah * detail implementasi. * * @serial termasuk * / private static class serializationProxy <e memperluas enum <e>> mengimplementasikan java.io.serializable { / ** * Jenis elemen dari set enum ini. * * @serial */ Private Final Class <E> ElementType; /*** Elemen yang terkandung dalam set enum ini. * * @serial */ private final enum [] elemen; SerializationProxy (enumset <E> set) {elementType = set.elementType; elemen = set.toArray (zero_length_enum_array); } private objek readResolve () {enumset <E> result = enumset.noneof (elementType); untuk (enum e: elemen) result.add ((e) e); hasil pengembalian; } private static final long serialversionuid = 362491234563181265l; } Objek writerplace () {return new SerializationProxy <> (this); } // Metode ReadObject untuk Pola Proksi Serialisasi // Lihat Java Efektif, Ed kedua., Item 78. Private Void ReadObject (Java.io.ObjectInputStream Stream) melempar java.io.invalidobjectException {throw java.io.invalidobjectException ("conseption (" croxy "; }}Meringkaskan
Di atas adalah semua tentang membaca kode sumber abstrak enumset, dan saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!