1. Latar belakang bagaimana enumterjadinya
Hari ini kita akan mengeksplorasi tipe data lain di Java: enum. Nama tersebut enumberasal dari kata pencacahan . Apa tipe data ini dan untuk apa?
Terkadang seorang programmer perlu membuat tipe data baru, yang kemungkinan nilainya terbatas pada daftar kecil yang tetap.
Misalnya, sebuah DayOfTheWeektipe hanya dapat mengambil nilai MONDAY, TUESDAY, WEDNESDAY, ... Total ada 7 nilai. Atau suatu Monthtipe hanya dapat mengambil nilai JANUARY, FEBRUARY, MARCH, ... Total ada 12 nilai.
Tentu saja, Anda dapat menggunakan nomor ( inttipe): 1— Senin, 2— Selasa, dll. Tetapi seseorang mungkin secara tidak sengaja menetapkan nilai yang tidak valid seperti 8atau 0ke variabel Anda.
Anda dapat dengan mudah mengalami situasi di mana seorang programmer menganggap hari dalam seminggu (atau bulan dalam setahun) diberi nomor mulai dari nol, sementara yang lain mengharapkan penomoran mereka dimulai dari satu, dll.
Itu sebabnya Java diperkenalkan enum, tipe data yang terdiri dari kumpulan nilai yang terbatas .
2. Mendeklarasikan sebuah tipe
Mendeklarasikan tipe data baru enumterlihat seperti ini:
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
Di mana TypeNamenama tipe baru (kelas), dan nilai yang mungkin dipisahkan dengan koma dan dibungkus dengan kurung kurawal: Value1, Value2, Value3.
Sebagai contoh, mari kita buat sendiri DayOfTheWeek enum:
| Kode | Catatan |
|---|---|
|
DayTipe baru Senin Selasa Rabu Kamis Jumat Sabtu Minggu |
Inilah cara Anda menetapkan nilai ke variabel tipe baru kami:
Day day = Day.MONDAY;
Contoh:
| Kode | Catatan |
|---|---|
|
Output layar akan menjadi: |
3. Metode anenum
Suatu enumtipe memiliki beberapa metode bawaan, dua di antaranya sangat menarik:
Metode statis values()mengembalikan array dari semua nilai tipe enum:
| Kode | Catatan |
|---|---|
|
Variabel daysmenyimpan array yang berisi nilai tipe Day(7 elemen) Menampilkan konten array di layar: |
Metode ordinal()mengembalikan nomor urut konstanta. Anda menyebutnya pada enumnilai daripada enumkelas:
| Kode | Keluaran konsol |
|---|---|
|
|
4. Konversi ke kelas
Pada kenyataannya, tidak ada yang ajaib di sini. Kompiler baru saja memberi kami gula sintaksis. Pada waktu kompilasi, Dayenum diubah menjadi kelas biasa:
| Kode, versi sederhana | Catatan |
|---|---|
|
Dayclass Daftar konstanta statis Array dengan semua nilai enum DayVariabel yang menyimpan nilai Dayobjek tertentu Kelas bersifat privat, yang berarti objek kelas Dayhanya dapat dibuat di dalam kelas. Metode harus dipanggil pada objek. Ini mengembalikan nilai objek — bidang . Metode mengembalikan array statis dengan semua nilai kelasconstructorDayDayordinalDayvalueDay |
Jika kami menghapus semua metode dan variabel statis dari Daykelas, kami mendapatkan yang berikut:
| Kode | Catatan |
|---|---|
|
Variabel valuemenyimpan nilai objek Dayobjek Dayhanya dapat dibuat di dalam Daykelas, karena konstruktornya adalah private. Metode ordinal()mengembalikan valueobjek Day. |
Dengan kata lain, tidak ada hal menakutkan yang terjadi di sini. Kompiler membuat Daykelas, menambahkan konstanta yang mewakili enumnilai, menambahkan metode yang diperlukan, dan membuat konstruktor kelas private. Kita akan melihat bagaimana konstruktor bekerja nanti.
Mudah-mudahan, sekarang sudah jelas mengapa kami menetapkan nilai ke variabel dengan cara ini:
Day day = Day.MONDAY;
MONDAYhanyalah bidang statis (konstanta) di Daykelas. Saat mengakses metode dan bidang statis dari luar kelas, Anda harus menunjukkan nama kelas sebelum nama bidang atau metode.
5. Lebih banyak metode anenum
Setiap enumkelas memiliki beberapa fitur menarik.
Konversi ke dan dari string
Untuk mengonversi objek enum menjadi string, Anda perlu memanggil metodenya toString().
String str = Day.MONDAY.toString();
Untuk mengonversi ke arah lain (dari string ke Dayobjek), Anda dapat menggunakan metode statis valueOf():
Day day = Day.valueOf("MONDAY");
Ini sangat nyaman dan akan sangat membantu dalam banyak kasus.
Konversi ke nomor dan kembali lagi
Anda sudah tahu cara mengonversi enumobjek menjadi angka: panggil ordinal()metode:
int index = Day.MONDAY.ordinal();
Untuk mengonversi ke arah lain (dari angka ke objek Day), Anda memerlukan konstruksi yang lebih transparan:
Day day = Day.values()[2];
Contoh:
| Kode | Catatan |
|---|---|
|
Senin Dapatkan indeks hari Senin: 0 Hari dalam seminggu 2 hari setelah Senin |
Poin penting: karena enumnilai adalah kumpulan tetap dari konstanta, mereka dapat dibandingkan menggunakan == . Dengan kata lain, Anda tidak dapat memiliki dua MONDAYobjek identik dengan alamat yang berbeda. Hanya ada satu instance dari setiap nilai enum. Dan itu berarti membandingkan variabel enum menggunakan == akan selalu berhasil.
6. Menambahkan metode Anda sendiri ke anenum
Karena an enumberubah menjadi kelas biasa pada waktu kompilasi, Anda dapat mendeklarasikan metode di dalamnya. Metode-metode ini hanya ditambahkan ke kelas yang dihasilkan oleh kompiler. Misalnya, kita ingin kita Day enummengembalikan daftar nilai enum daripada array.
Kemudian kita dapat menambahkan kode berikut:
| Kode | Catatan |
|---|---|
|
Titik koma diperlukan setelah daftar nilai. Buat ArrayListobjek Tambahkan nilai dalam larik yang dikembalikan oleh values()metode. Kembalikan daftar. |
Sekarang metode ini dapat dipanggil dalam kode:
| Kode | Catatan |
|---|---|
|
Variabel listakan menyimpan daftar semua nilai dari Day enum. |
GO TO FULL VERSION