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


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

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







System.out.println(days[2]);
Pembolehubah daysmenyimpan tatasusunan yang mengandungi nilai jenis Day(7 elemen)

Paparkan kandungan tatasusunan pada skrin:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

WEDNESDAY

Kaedah ordinal()mengembalikan nombor ordinal pemalar. Anda memanggilnya pada enumnilai dan bukannya enumkelas:

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


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
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;
   }
}
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 kelasconstructorDayDay



ordinalDay

value


Day

Jika kami mengalih keluar semua kaedah statik dan pembolehubah dari Daykelas, kami mendapat yang berikut:

Kod Catatan
public class Day
{
  private int value;

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

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


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
Day day = Day.MONDAY;
int index = day.ordinal();
Day newDay = Day.values()[index+2];
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
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;
   }

}








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