1. Latar belakang tentang bagaimana enumia berlaku
Hari ini kita akan meneroka jenis data lain dalam Java: enum. Nama itu enumberasal daripada perkataan enumeration . Apakah jenis data ini dan untuk apa ia?
Kadangkala pengaturcara perlu mencipta jenis data baharu, yang kemungkinan nilainya terhad kepada senarai tetap kecil.
Sebagai contoh, DayOfTheWeekjenis hanya boleh mengambil nilai MONDAY, TUESDAY, WEDNESDAY, ... Terdapat 7 nilai kesemuanya. Atau Monthjenis hanya boleh mengambil nilai JANUARY, FEBRUARY, MARCH, ... Terdapat 12 nilai kesemuanya.
Sudah tentu, anda menggunakan nombor boleh ( intjenis): 1— Isnin, 2— Selasa, dsb. Tetapi seseorang mungkin secara tidak sengaja menetapkan nilai tidak sah seperti 8atau 0pada pembolehubah anda.
Anda boleh dengan mudah mengalami situasi di mana seorang pengaturcara menganggap hari dalam seminggu (atau bulan dalam setahun) dinomborkan bermula dari sifar, manakala yang lain mengharapkan penomboran mereka bermula dari satu, dsb.
Itulah sebabnya Java memperkenalkan enum, jenis data yang terdiri daripada set nilai terhingga .
2. Mengisytiharkan jenis
Mengisytiharkan enumjenis data baharu kelihatan seperti ini:
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
Di manakah TypeNamenama jenis (kelas) baharu dan nilai yang mungkin dipisahkan dengan koma dan dibalut dengan pendakap kerinting: Value1, Value2, Value3.
Sebagai contoh, mari kita buat sendiri DayOfTheWeek enum:
| Kod | Catatan |
|---|---|
|
DayJenis baru Isnin Selasa Rabu Khamis Jumaat Sabtu Ahad |
Berikut ialah cara anda menetapkan nilai kepada pembolehubah jenis baharu kami:
Day day = Day.MONDAY;
Contoh:
| Kod | Catatan |
|---|---|
|
Output skrin akan menjadi: |
3. Kaedah anenum
Sesuatu enumjenis mempunyai beberapa kaedah terbina dalam, dua daripadanya sangat menarik:
Kaedah statik values()mengembalikan tatasusunan semua nilai jenis enum:
| Kod | Catatan |
|---|---|
|
Pembolehubah daysmenyimpan tatasusunan yang mengandungi nilai jenis Day(7 elemen) Paparkan kandungan tatasusunan pada skrin: |
Kaedah ordinal()mengembalikan nombor ordinal pemalar. Anda memanggilnya pada enumnilai dan bukannya enumkelas:
| Kod | Output konsol |
|---|---|
|
|
4. Menukar kepada kelas
Pada hakikatnya, tiada apa-apa yang ajaib di sini. Pengkompil hanya memberi kami gula sintaksis. Pada masa penyusunan, Dayenum ditukar kepada kelas biasa:
| Kod, versi ringkas | Catatan |
|---|---|
|
Daykelas Senarai pemalar statik Tatasusunan dengan semua nilai enum DayPembolehubah yang menyimpan nilai Dayobjek tertentu Kelas adalah peribadi, yang bermaksud objek kelas Dayhanya boleh dibuat di dalam kelas. Kaedah mesti dipanggil pada objek. Ia mengembalikan nilai objek — medan. Kaedah ini mengembalikan tatasusunan statik dengan semua nilai kelasconstructorDayDayordinalDayvalueDay |
Jika kami mengalih keluar semua kaedah statik dan pembolehubah dari Daykelas, kami mendapat yang berikut:
| Kod | Catatan |
|---|---|
|
Pembolehubah valuemenyimpan nilai objek Dayobjek Dayhanya boleh dibuat di dalam Daykelas, kerana pembina ialah private. Kaedah ordinal()mengembalikan valueobjek Day. |
Dalam erti kata lain, tiada apa yang menakutkan berlaku di sini. Pengkompil mencipta Daykelas, menambah pemalar yang mewakili enumnilai, menambah kaedah yang diperlukan dan menjadikan pembina kelas private. Kami akan melihat bagaimana pembina berfungsi sedikit kemudian.
Mudah-mudahan, kini jelas mengapa kami menetapkan nilai kepada pembolehubah dengan cara ini:
Day day = Day.MONDAY;
MONDAYhanyalah medan statik (malar) dalam Daykelas. Apabila mengakses kaedah dan medan statik dari luar kelas, anda mesti menunjukkan nama kelas sebelum nama medan atau kaedah.
5. Lebih banyak kaedah anenum
Setiap enumkelas mempunyai beberapa ciri menarik.
Menukar kepada dan dari rentetan
Untuk menukar objek enum kepada rentetan, anda perlu memanggil kaedahnya toString().
String str = Day.MONDAY.toString();
Untuk menukar ke arah lain (dari rentetan kepada Dayobjek), anda boleh menggunakan valueOf()kaedah statik:
Day day = Day.valueOf("MONDAY");
Ia sangat mudah dan akan membantu dalam banyak kes.
Menukar kepada nombor dan kembali semula
Anda sudah tahu cara menukar enumobjek kepada nombor: panggil ordinal()kaedah:
int index = Day.MONDAY.ordinal();
Untuk menukar ke arah lain (daripada nombor kepada Dayobjek), anda memerlukan binaan yang lebih telus:
Day day = Day.values()[2];
Contoh:
| Kod | Catatan |
|---|---|
|
Isnin Dapatkan indeks Isnin: 0 Hari dalam seminggu 2 hari selepas Isnin |
Perkara penting: kerana enumnilai ialah set tetap pemalar, ia boleh dibandingkan menggunakan == . Dalam erti kata lain, anda tidak boleh mempunyai dua MONDAYobjek yang sama dengan alamat yang berbeza. Hanya satu contoh bagi setiap nilai enum wujud. Dan ini bermakna bahawa membandingkan pembolehubah enum menggunakan == akan sentiasa berfungsi.
6. Menambah kaedah anda sendiri padaenum
Kerana enumbertukar menjadi kelas biasa pada masa penyusunan, anda boleh mengisytiharkan kaedah di dalamnya. Kaedah ini hanya ditambahkan pada kelas yang dihasilkan oleh pengkompil. Sebagai contoh, katakan kita mahu kita Day enummengembalikan senarai nilai enum dan bukannya tatasusunan.
Kemudian kita boleh menambah kod berikut:
| Kod | Catatan |
|---|---|
|
Koma bertitik diperlukan selepas senarai nilai. Cipta ArrayListobjek Tambah nilai dalam tatasusunan yang dikembalikan oleh values()kaedah. Kembalikan senarai. |
Sekarang kaedah ini boleh dipanggil dalam kod:
| Kod | Catatan |
|---|---|
|
Pembolehubah listakan menyimpan senarai semua nilai Day enum. |
GO TO FULL VERSION