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
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY
}
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
Day day = Day.FRIDAY;
System.out.println(day);
Output layar akan menjadi:
FRIDAY


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
Day[] days = Day.values();

for (Day day: days)
   System.out.println(day);







System.out.println(days[2]);
Variabel daysmenyimpan array yang berisi nilai tipe Day(7 elemen)

Menampilkan konten array di layar:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

WEDNESDAY

Metode ordinal()mengembalikan nomor urut konstanta. Anda menyebutnya pada enumnilai daripada enumkelas:

Kode Keluaran konsol
System.out.println(Day.MONDAY.ordinal());
System.out.println(Day.FRIDAY.ordinal());
System.out.println(Day.SUNDAY.ordinal());
0
4
6


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
public class Day
{
   public static final Day MONDAY = new Day(0);
   public static final Day TUESDAY = new Day(1);
   public static final Day WEDNESDAY = new Day(2);
   public static final Day THURSDAY = new Day(3);
   public static final Day FRIDAY = new Day(4);
   public static final Day SATURDAY = new Day(5);
   public static final Day SUNDAY = new Day(6);

    private static final Day[] array = {MONDAY, TUESDAY,
      WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};

   private final int value;

   private Day (int value)
   {
      this.value = value;
   }

   public int ordinal()
   {
      return this.value;
   }

   public static Day[] values()
   {
      return array;
   }
}
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 kelasconstructorDayDay



ordinalDay

value


Day

Jika kami menghapus semua metode dan variabel statis dari Daykelas, kami mendapatkan yang berikut:

Kode Catatan
public class Day
{
  private int value;

  private Day (int value)
  {
    this.value = value;
  }

  public int ordinal()
  {
    return this.value;
  }
}


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
Day day = Day.MONDAY;
int index = day.ordinal();
Day newDay = Day.values()[index+2];
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
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY;

   public static List<Day> asList()
   {
      ArrayList<Day> list = new ArrayList<Day>();

      Collections.addAll(list, values());

      return list;
   }

}








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
List<Day> list = Day.asList();
Variabel listakan menyimpan daftar semua nilai dari Day enum.