1. Latar belakang tentang bagaimana enum
ia berlaku
Hari ini kita akan meneroka jenis data lain dalam Java: enum
. Nama itu enum
berasal 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, DayOfTheWeek
jenis hanya boleh mengambil nilai MONDAY
, TUESDAY
, WEDNESDAY
, ... Terdapat 7 nilai kesemuanya. Atau Month
jenis hanya boleh mengambil nilai JANUARY
, FEBRUARY
, MARCH
, ... Terdapat 12 nilai kesemuanya.
Sudah tentu, anda menggunakan nombor boleh ( int
jenis): 1
— Isnin, 2
— Selasa, dsb. Tetapi seseorang mungkin secara tidak sengaja menetapkan nilai tidak sah seperti 8
atau 0
pada 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 enum
jenis data baharu kelihatan seperti ini:
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
Di manakah TypeName
nama 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 |
---|---|
|
Day Jenis 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 enum
jenis mempunyai beberapa kaedah terbina dalam, dua daripadanya sangat menarik:
Kaedah statik values()
mengembalikan tatasusunan semua nilai jenis enum
:
Kod | Catatan |
---|---|
|
Pembolehubah days menyimpan tatasusunan yang mengandungi nilai jenis Day (7 elemen) Paparkan kandungan tatasusunan pada skrin:
|
Kaedah ordinal()
mengembalikan nombor ordinal pemalar. Anda memanggilnya pada enum
nilai dan bukannya enum
kelas:
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, Day
enum ditukar kepada kelas biasa:
Kod, versi ringkas | Catatan |
---|---|
|
Day kelas Senarai pemalar statik Tatasusunan dengan semua nilai enum Day Pembolehubah yang menyimpan nilai Day objek tertentu Kelas adalah peribadi, yang bermaksud objek kelas Day hanya boleh dibuat di dalam kelas. Kaedah mesti dipanggil pada objek. Ia mengembalikan nilai objek — medan. Kaedah ini mengembalikan tatasusunan statik dengan semua nilai kelasconstructor Day Day ordinal Day value Day |
Jika kami mengalih keluar semua kaedah statik dan pembolehubah dari Day
kelas, kami mendapat yang berikut:
Kod | Catatan |
---|---|
|
Pembolehubah value menyimpan nilai objek Day objek Day hanya boleh dibuat di dalam Day kelas, kerana pembina ialah private . Kaedah ordinal() mengembalikan value objek Day . |
Dalam erti kata lain, tiada apa yang menakutkan berlaku di sini. Pengkompil mencipta Day
kelas, menambah pemalar yang mewakili enum
nilai, 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;
MONDAY
hanyalah medan statik (malar) dalam Day
kelas. 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 enum
kelas 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 Day
objek), 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 enum
objek kepada nombor: panggil ordinal()
kaedah:
int index = Day.MONDAY.ordinal();
Untuk menukar ke arah lain (daripada nombor kepada Day
objek), 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 enum
nilai ialah set tetap pemalar, ia boleh dibandingkan menggunakan == . Dalam erti kata lain, anda tidak boleh mempunyai dua MONDAY
objek 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 enum
bertukar 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 enum
mengembalikan senarai nilai enum dan bukannya tatasusunan.
Kemudian kita boleh menambah kod berikut:
Kod | Catatan |
---|---|
|
Koma bertitik diperlukan selepas senarai nilai. Cipta ArrayList objek Tambah nilai dalam tatasusunan yang dikembalikan oleh values() kaedah. Kembalikan senarai. |
Sekarang kaedah ini boleh dipanggil dalam kod:
Kod | Catatan |
---|---|
|
Pembolehubah list akan menyimpan senarai semua nilai Day enum . |
GO TO FULL VERSION