1. Háttér, hogyan enumjött létre

Ma egy másik típusú adattípust fogunk felfedezni a Java nyelvben: enum. A név a felsorolásenum szóból származik . Mi ez az adattípus és mire való?

Néha a programozónak új adattípust kell létrehoznia, amelynek lehetséges értékei egy kis rögzített listára korlátozódnak.

Például egy típus csak a , , , ... DayOfTheWeekértékeket veheti fel. Összesen 7 érték van. Vagy egy típus csak a , , , ... értékeket veheti fel. Összesen 12 érték van.MONDAYTUESDAYWEDNESDAYMonthJANUARYFEBRUARYMARCH

Természetesen használhatsz számokat (a inttípust): 1— Hétfő, 2— Kedd stb. De előfordulhat, hogy valaki véletlenül érvénytelen értékeket rendel a változójához, például 8vagy .0

Könnyen előfordulhat, hogy az egyik programozó azt gondolja, hogy a hét napjai (vagy az év hónapjai) nullától kezdődően vannak számozva, míg mások azt várják, hogy a számozás egytől induljon stb.

Ezért vezette be a Java , egy véges értékkészletbőlenum álló adattípust .


2. Típus deklarálása

Az új enumadattípus deklarálása így néz ki:

enum TypeName
{
   VALUE1,
   VALUE2,
   VALUE3
}

Hol TypeNamevan az új típus (osztály) neve, és a lehetséges értékeket vesszővel választjuk el, és kapcsos zárójelbe foglaljuk: Value1, Value2, Value3.

Példaként hozzuk létre a sajátunkat DayOfTheWeek enum:

Kód jegyzet
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY
}
Új Daytípus

hétfő
kedd
szerda
csütörtök
péntek
szombat
vasárnap

Így rendelhet értéket egy új típusú változóhoz:

Day day = Day.MONDAY;

Példa:

Kód jegyzet
Day day = Day.FRIDAY;
System.out.println(day);
A képernyő kimenete a következő lesz:
FRIDAY


3. Az anenum

Egy enumtípusnak számos beépített módszere van, amelyek közül kettő nagyon érdekes:

A statikus values()metódus a következő típusú összes érték tömbjét adja vissza enum:

Kód jegyzet
Day[] days = Day.values();

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







System.out.println(days[2]);
A daysváltozó a típus értékeit tartalmazó tömböt tárol Day(7 elem)

Jelenítse meg a tömb tartalmát a képernyőn:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

WEDNESDAY

A ordinal()metódus az állandó sorszámát adja vissza. Inkább értéknek nevezed, enummint osztálynak enum:

Kód Konzol kimenet
System.out.println(Day.MONDAY.ordinal());
System.out.println(Day.FRIDAY.ordinal());
System.out.println(Day.SUNDAY.ordinal());
0
4
6


4. Osztálytá alakítás

Valójában nincs itt semmi varázslatos. A fordító csak egy kis szintaktikai cukrot adott nekünk. Fordításkor az Dayenum egy közönséges osztállyá alakul:

Kód, egyszerűsített változat jegyzet
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

Statikus konstansok listája Egy tömb az enum







összes értékével Egy változó, amely egy adott objektum értékét tárolja Az osztály privát, ami azt jelenti, hogy az osztály objektumai csak az osztályon belül hozhatók létre . A metódust egy objektumon kell meghívni . Visszaadja az objektum értékét — a mezőt. A metódus egy statikus tömböt ad vissza az osztály összes értékévelDay


Day

DayconstructorDayDay



ordinalDay

value


Day

Ha az összes statikus metódust és változót eltávolítjuk az osztályból Day, a következőket kapjuk:

Kód jegyzet
public class Day
{
  private int value;

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

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


A változó az objektum objektumok valueértékét tárolja csak az osztályon belül hozható létre , mivel a konstruktor a . A metódus az objektum értékét adja vissza. Day

DayDayprivate




ordinal()valueDay

Más szóval, itt nem történik semmi ijesztő. A fordító létrehozza az Dayosztályt, hozzáadja az értékeket reprezentáló konstansokat enum, hozzáadja a szükséges metódusokat, és elkészíti az osztálykonstruktort private. Kicsit később megnézzük, hogyan dolgoznak a konstruktőrök.

Remélhetőleg most már világos, hogy miért rendelünk értéket egy változóhoz így:

Day day = Day.MONDAY;

MONDAYcsak egy statikus mező (konstans) az osztályban Day. Ha az osztályon kívülről ér el statikus metódusokat és mezőket, meg kell adnia az osztály nevét a mező vagy metódus neve előtt.



5. További módszerek anenum

Minden enumosztálynak számos érdekes funkciója van.

Konvertálás karakterláncra és karakterláncból

Egy enum objektum karakterláncsá alakításához meg kell hívnia a metódusát toString().

String str = Day.MONDAY.toString();

A másik irányba (karakterláncból objektummá Day) történő konvertáláshoz használhatja a statikus valueOf()módszert:

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

Nagyon kényelmes, és sok esetben hasznos lesz.

Számmá konvertálás és vissza

Már tudja, hogyan lehet egy enumobjektumot számmá alakítani: hívja meg a ordinal()metódust:

int index = Day.MONDAY.ordinal();

A másik irányú konvertáláshoz (számból objektummá Day) átláthatóbb konstrukcióra van szüksége:

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

Példák:

Kód jegyzet
Day day = Day.MONDAY;
int index = day.ordinal();
Day newDay = Day.values()[index+2];
Hétfő
A hétfő indexének lekérése: 0
A hét napja 2 nappal a hétfő után

Fontos szempont: mivel enumaz értékek állandó konstansok fix halmaza, az == használatával összehasonlíthatók . Más szóval, nem lehet két azonos MONDAYobjektum különböző címmel. Minden enumértéknek csak egyetlen példánya létezik. Ez pedig azt jelenti, hogy az enum változók == használatával történő összehasonlítása mindig működni fog.



6. Saját metódusok hozzáadása egyenum

Mivel a enumfordítási időben egy közönséges osztállyá válik, deklarálhatunk benne metódusokat. Ezeket a metódusokat egyszerűen hozzáadják a fordító által generált osztályhoz. Day enumTegyük fel például, hogy tömb helyett az enum értékek listáját szeretnénk visszaadni.

Ezután a következő kódot adhatjuk hozzá:

Kód jegyzet
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;
   }

}








Az értéklista után pontosvessző szükséges. Objektum



létrehozása Adja hozzá az értékeket a metódus által visszaadott tömbben . Vissza a listát. ArrayList

values()

Most ez a módszer kódban hívható:

Kód jegyzet
List<Day> list = Day.asList();
A listváltozó tárolja az összes érték listáját Day enum.