JavaRush /Java Blog /Random-ID /Pencacahan di Jawa (java enum)
articles
Level 15

Pencacahan di Jawa (java enum)

Dipublikasikan di grup Random-ID
Saat memprogram, kita sering menghadapi kebutuhan untuk membatasi kumpulan nilai valid untuk tipe data tertentu. Jadi, misalnya, hari dalam seminggu dapat memiliki 7 nilai berbeda, bulan dalam setahun dapat memiliki 12, dan musim dapat memiliki 4. Untuk mengatasi masalah seperti itu, banyak bahasa pemrograman yang diketik secara statis menyediakan tipe data khusus - pencacahan ( enum). Pencacahan tidak langsung muncul di Jawa. Konstruksi bahasa khusus enumdiperkenalkan mulai dari versi 1.5. Hingga saat ini, pemrogram telah menggunakan metode lain untuk mengimplementasikan enumerasi. Pencacahan di Jawa (java enum) - 1

konstruksi enum

Mari kita mulai dengan sebuah contoh. Mari kita jelaskan enumtipe data untuk menyimpan musim menggunakan:
enum Season { WINTER, SPRING, SUMMER, AUTUMN }
Nah, contoh sederhana penggunaannya:
Season season = Season.SPRING;
if (season == Season.SPRING) season = Season.SUMMER;
System.out.println(season);
Hasilnya SUMMER akan dicetak ke konsol . Menurut saya contohnya sudah jelas dan tidak perlu penjelasan.

Enum adalah sebuah kelas

Dengan mendeklarasikan enum, secara implisit kita membuat kelas turunan dari java.lang.Enum. Secara konvensional, konstruksinya enum Season { ... }setara dengan class Season extends java.lang.Enum { ... }. Dan meskipun kompiler tidak mengizinkan kita untuk secara eksplisit mewarisi dari java.lang.Enumkita, masih mudah untuk memverifikasi bahwa enumitu diwarisi menggunakan reflection:
System.out.println(Season.class.getSuperclass());
Berikut ini akan ditampilkan di konsol:
class java.lang.Enum
Warisan sebenarnya secara otomatis dilakukan untuk kita oleh kompiler Java. Selanjutnya, mari kita sepakat untuk memanggil kelas yang dibuat oleh kompiler untuk mengimplementasikan enumerasi sebagai kelas enum-, dan nilai yang mungkin dari tipe enumerasi sebagai enumelemen -a.

Anggota enum adalah turunan enumdari kelas - yang dapat diakses secara statis

Elemen enum Season (WINTER, SPRING и т.д.)adalah instance enum-class yang dapat diakses secara statis Season. Ketersediaan statisnya memungkinkan kami melakukan perbandingan menggunakan operator perbandingan referensi ==. Contoh:
Season season = Season.SUMMER;
if (season == Season.AUTUMN) season = Season.WINTER;

Nama dan nomor seri elemen enum

Seperti disebutkan sebelumnya, setiap enumkelas mewarisi java.lang.Enum, yang berisi sejumlah metode yang berguna untuk semua enumerasi. Contoh:
Season season = Season.WINTER;
System.out.println("season.name()=" + season.name() + " season.toString()=" + season.toString() + " season.ordinal()=" + season.ordinal());
Outputnya adalah:
season.name()=WINTER season.toString()=WINTER season.ordinal()=0
Metodenya name(), toString()dan ditampilkan di sini ordinal(). Semantik metodenya jelas. Perlu dicatat bahwa metode ini enumdiwarisi dari kelas java.lang.Enum. Mendapatkan elemen enumdengan representasi string dari namanya Seringkali muncul tugas untuk mendapatkan elemen enumdengan representasi stringnya. Untuk tujuan ini, di setiap enumkelas -, kompiler secara otomatis membuat metode statis khusus: public static EnumClass valueOf(String name), yang mengembalikan elemen enumerasi EnumClassdengan nama yang sama dengan name. Contoh penggunaan:
String name = "WINTER";
Season season = Season.valueOf(name);
Sebagai hasil dari mengeksekusi kode, variabel musim akan sama dengan Season.WINTER. Harap dicatat bahwa jika elemen tidak ditemukan, IllegalArgumentException akan dilempar , dan jika namesama null, NullPointerException akan dilempar . Ngomong-ngomong, hal ini sering kali terlupakan. Untuk beberapa alasan, banyak yang sangat yakin bahwa jika suatu fungsi mengambil satu argumen dan dalam kondisi tertentu memunculkan IllegalArgumentException , maka ketika meneruskannya ke sana , IllegalArgumentExceptionnull pasti akan dilempar juga . Tapi itu bukan intinya. Ayo lanjutkan. Mendapatkan semua elemen enumerasi Terkadang Anda perlu mendapatkan daftar semua elemen kelas pada saat run time. Untuk tujuan ini, kompiler membuat metode di setiap -class . Contoh penggunaan: enumenumpublic static EnumClass[] values()
System.out.println(Arrays.toString(Season.values()));
Kami mendapatkan output berikut:
[WINTER, SPRING, SUMMER, AUTUMN]
Perhatikan bahwa baik metode valueOf()maupun metode tidak values()didefinisikan di kelas java.lang.Enum. Sebaliknya, mereka secara otomatis ditambahkan oleh kompiler ketika enumkelas - dikompilasi. Menambahkan metode Anda sendiri ke enum-kelas Anda memiliki kesempatan untuk menambahkan metode Anda sendiri ke kelas enum-dan elemen-elemennya: Pencacahan di Jawa (java enum) - 2Sama, tetapi dengan polimorfisme: Pencacahan di Jawa (java enum) - 3Contoh terakhir menunjukkan penggunaan pewarisan di enum. Lebih lanjut tentang ini nanti. Warisanenum di Java enummemungkinkan Anda mengimplementasikan hierarki kelas, yang objeknya dibuat dalam satu instance dan dapat diakses secara statis. Dalam hal ini, elemen enumdapat berisi konstruktornya sendiri. Mari kita beri contoh: Pencacahan di Jawa (java enum) - 4Di sini kita mendeklarasikan enumerasi Typedengan tiga elemen INT, INTEGERdan STRING. Kompiler akan membuat kelas dan objek berikut:
  • Type- kelas berasal darijava.lang.Enum
  • INT— objek kelas 1 berasal dariType
  • INTEGER— objek kelas 2 berasal dariType
  • STRING— objek kelas 3 berasal dariType
Tiga kelas turunan akan dibuat dengan metode polimorfik Object parse(String)dan konstruktor Type(..., boolean). Pada saat yang sama, objek kelas INT, INTEGERdan STRINGada dalam satu salinan dan dapat diakses secara statis. Anda dapat memverifikasi ini:
System.out.println(Type.class);
System.out.println(Type.INT.getClass() + " " + Type.INT.getClass().getSuperclass());
System.out.println(Type.INTEGER.getClass() + " " + Type.INTEGER.getClass().getSuperclass());
System.out.println(Type.STRING.getClass()  + " " + Type.STRING.getClass().getSuperclass());
Kami mendapatkan output berikut:
class Type
class Type$1 class Type
class Type$2 class Type
class Type$3 class Type
Dapat dilihat bahwa compiler membuat sebuah kelas Typedan 3 nestedkelas turunannya Type.

Kelas enum yang didekompilasi dengan warisan

Untuk mempertegas hal di atas, kami sajikan pula hasil dekompilasi enumerasi Typedari contoh di atas: Pencacahan di Jawa (java enum) - 5

Pencacahan dan polimorfisme parametrik

Pembaca mungkin bertanya-tanya: " Mengapa pencacahan Tipe di atas tidak menggunakan obat generik? " Faktanya di Jawa penggunaan obat generik enumdilarang. Jadi contoh berikut tidak dapat dikompilasi:
enum Type<T> {}

Pelajaran lanjutan

Untuk pemahaman yang lebih mendalam tentang cara kerja enumerasi di Java, saya sarankan Anda membiasakan diri dengan kode sumber kelas java.lang.Enum, dan juga menggunakan dekompiler Jad untuk mempelajari kode yang dihasilkan. Selain itu, mempelajari kode sumber perpustakaan Java mutlak diperlukan untuk memahami berapa banyak mekanisme di Java yang berfungsi dan berguna sebagai referensi untuk desain berorientasi objek. Tautan ke sumber asli: http://alexander.lds.lg.ua/
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION