1. Latar kepriye enumkedadeyane

Dina iki kita bakal njelajah jinis data liyane ing Jawa: enum. Jeneng kasebut enumasale saka tembung enumerasi . Apa jinis data iki lan kanggo apa?

Kadhangkala programmer kudu nggawe jinis data anyar, sing nilai bisa diwatesi menyang dhaptar tetep cilik.

Contone, DayOfTheWeekjinis mung bisa njupuk nilai MONDAY, TUESDAY, WEDNESDAY, ... Ana 7 nilai total. Utawa Monthjinis mung bisa njupuk mung nilai JANUARY, FEBRUARY, MARCH, ... Ana 12 nilai total.

Mesthi, sampeyan nggunakake bisa nomer ( intjinis): 1- Senin, 2- Selasa, etc. Nanging wong bisa sengaja nemtokake nilai ora bener kayata 8utawa 0kanggo variabel Panjenengan.

Sampeyan bisa kanthi gampang duwe kahanan sing siji programmer mikir dina minggu (utawa sasi ing taun) sing nomer wiwit saka nul, nalika liyane ngarepake nomer sing diwiwiti saka siji, etc.

Pramila Jawa ngenalaken enum, jinis data sing kasusun saka sakumpulan nilai sing winates .


2. Nerangake jinis

Nyatakake jinis data anyar enumkaton kaya iki:

enum TypeName
{
   VALUE1,
   VALUE2,
   VALUE3
}

Endi TypeNamejeneng jinis anyar (kelas), lan nilai bisa dipisahake dening koma lan kebungkus kurung kriting: Value1, Value2, Value3.

Minangka conto, ayo nggawe dhewe DayOfTheWeek enum:

Kode Cathetan
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY
}
DayJinis anyar

Senin
Selasa
Rebo
Kemis
Jum'at
Setu
Minggu

Mangkene carane sampeyan nemtokake nilai kanggo variabel jinis anyar kita:

Day day = Day.MONDAY;

Tuladha:

Kode Cathetan
Day day = Day.FRIDAY;
System.out.println(day);
Output layar bakal dadi:
FRIDAY


3. Metode anenum

Sawijining enumjinis duwe sawetara metode sing dibangun, loro sing menarik banget:

Cara statis values()ngasilake array saka kabeh nilai saka enumjinis:

Kode Cathetan
Day[] days = Day.values();

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







System.out.println(days[2]);
Variabel daysnyimpen array sing ngemot nilai saka Dayjinis (7 unsur)

Nampilake isi array ing layar:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

WEDNESDAY

Cara ordinal()ngasilake nomer ordinal saka konstanta. Sampeyan nyebataken ing enumnilai tinimbang enumkelas:

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


4. Ngonversi menyang kelas

Ing kasunyatan, ora ana sing magis ing kene. Compiler mung menehi gula sintaksis. Ing wektu kompilasi, Dayenum diowahi dadi kelas biasa:

Kode, versi prasaja Cathetan
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

Dhaftar konstanta statis







Larik karo kabeh nilai saka Dayenum


Variabel sing nyimpen Nilai saka Dayobyek tartamtu

Kelas iku pribadi, kang tegese obyek saka Daykelas mung bisa digawe nang kelas. Cara kasebut kudu diarani obyek. Iki ngasilake nilai obyek - lapangan . Cara kasebut ngasilake array statis kanthi kabeh nilai kelasconstructorDayDay



ordinalDay

value


Day

Yen mbusak kabeh metode statis lan variabel saka Daykelas, kita entuk ing ngisor iki:

Kode Cathetan
public class Day
{
  private int value;

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

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


Variabel valuenyimpen nilai obyek Dayobyek

Daymung bisa digawe nang Daykelas, wiwit konstruktor punika private.




Cara ordinal()ngasilake obyek valuekasebut Day.

Ing tembung liya, ora ana sing medeni ing kene. Compiler nggawe Daykelas, nambah konstanta sing makili enumnilai, nambah cara sing perlu, lan nggawe konstruktor kelas private. Kita bakal nliti cara kerja konstruktor mengko.

Muga-muga, saiki wis jelas kenapa kita menehi nilai menyang variabel kanthi cara iki:

Day day = Day.MONDAY;

MONDAYmung lapangan statis (konstan) ing Daykelas. Nalika ngakses metode statis lan kolom saka njaba kelas, sampeyan kudu nunjukake jeneng kelas sadurunge jeneng lapangan utawa metode.



5. Cara liyane saka anenum

Saben enumkelas duwe sawetara fitur menarik.

Ngonversi menyang lan saka senar

Kanggo ngowahi obyek enum dadi senar, sampeyan kudu nelpon toString()metode kasebut.

String str = Day.MONDAY.toString();

Kanggo ngowahi arah liyane (saka senar menyang Dayobyek), sampeyan bisa nggunakake valueOf()cara statis:

Day day = Day.valueOf("MONDAY");

Iku super trep lan bakal mbiyantu ing akeh kasus.

Ngonversi menyang nomer lan bali maneh

Sampeyan wis ngerti carane ngowahi enumobyek menyang nomer: nelpon ordinal()cara:

int index = Day.MONDAY.ordinal();

Kanggo ngowahi arah liyane (saka nomer menyang Dayobyek), sampeyan butuh konstruksi sing luwih transparan:

Day day = Day.values()[2];

Tuladha:

Kode Cathetan
Day day = Day.MONDAY;
int index = day.ordinal();
Day newDay = Day.values()[index+2];
Senin
Entuk indeks Senin: 0
Dina minggu 2 dina sawise Senin

Titik penting: amarga enumnilai-nilai minangka set konstanta tetep, bisa dibandhingake nggunakake == . Ing tembung liyane, sampeyan ora bisa duwe rong MONDAYobyek sing padha karo alamat beda. Mung siji conto saka saben nilai enum ana. Lan tegese mbandhingake variabel enum nggunakake == bakal tansah bisa.



6. Nambahake cara dhewe menyangenum

Amarga enumdadi kelas biasa ing wektu kompilasi, sampeyan bisa ngumumake metode kasebut. Cara kasebut mung ditambahake ing kelas sing digawe kompiler. Contone, umpamane kita pengin Day enumbali dhaptar nilai enum tinimbang array.

Banjur kita bisa nambah kode ing ngisor iki:

Kode Cathetan
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 dibutuhake sawise dhaptar nilai.



Nggawe ArrayListobyek

Tambah nilai ing larik bali dening values()cara.
Mbalik dhaptar.

Saiki cara iki bisa diarani kode:

Kode Cathetan
List<Day> list = Day.asList();
Variabel listbakal nyimpen dhaptar kabeh nilai saka Day enum.