1. Tło wygląduenum

Dzisiaj poznamy inny rodzaj typów danych w Javie - enum. Nazwa enumpochodzi od słowa Enumeration – enumeration. Czym jest ten typ danych i z czym jest spożywany?

Czasami programista musi stworzyć nowy typ danych, którego zmienne przyjmują tylko wartości z małej ustalonej listy.

Na przykład typ ДеньНеделиmoże przyjmować tylko wartości ПОНЕДЕЛЬНИК, ВТОРНИК, СРЕДА, ... W sumie jest 7 wartości. Lub typ Месяцmoże przyjmować tylko wartości ЯНВАРЬ, ФЕВРАЛЬ, МАРТ, ... W sumie jest 12 wartości.

Możesz oczywiście użyć liczb (typ int): 1- poniedziałek, 2- wtorek itd. Ale ktoś może przypadkowo przypisać takiej zmiennej wartość 8lub np. wartość 0.

Łatwo może dojść do sytuacji, gdy jeden programista myśli, że dni tygodnia (lub miesiące) są liczone od zera, inny myśli, że od jedynki i tak dalej.

Dlatego Java wymyśliła typ danych, który składa się ze skończonego zestawu wartości - enum.


2. Deklaracja typu

Deklaracja nowego typu danych wygląda enumnastępująco:

enum NazwaТипа
{
   ЗНАЧЕНИЕ1,
   ЗНАЧЕНИЕ2,
   ЗНАЧЕНИЕ3
}

Gdzie NazwaТипаjest nazwa nowego typu (klasy), a możliwe wartości podane są w nawiasach oddzielonych przecinkami: Значение1, Значение2, Значение3.

Dla przykładu stwórzmy własne enumdla typu ДеньНедели:

Kod Notatka
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY
}
Nowy typ Day

Poniedziałek
Wtorek Środa
Czwartek Piątek Sobota Niedziela



Możesz przypisać wartości do zmiennych tego typu w następujący sposób:

Day day = Day.MONDAY;

Przykład:

Kod Notatka
Day day = Day.FRIDAY;
System.out.println(day);
Na ekranie pojawi się:
FRIDAY


3. enumMetody

Typ enumma kilka wbudowanych metod, dwie z nich są bardzo interesujące:

Metoda statyczna values()zwraca tablicę wszystkich wartości typu enum:

Kod Notatka
Day[] days = Day.values();

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







System.out.println(days[2]);
W zmiennej przechowywana jest daystablica wartości typu Day(7 sztuk)

Zawartość tablicy wyświetlamy na ekranie:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

WEDNESDAY

Metoda ordinal()zwraca liczbę porządkową stałej. Musisz wywołać to nie na klasie enum, ale na wartości enum:

Kod Wyjście na wyświetlaczu
System.out.println(Day.MONDAY.ordinal());
System.out.println(Day.FRIDAY.ordinal());
System.out.println(Day.SUNDAY.ordinal());
0
4
6


4. Konwersja do klasy

W rzeczywistości nie ma tu żadnej magii, a kompilator po prostu posypał nas cukrem składniowym. W czasie kompilacji klasa enum Dayzostanie przekonwertowana na zwykłą klasę:

Kod, wersja uproszczona Notatka
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;
   }
}
Klasa Day

Lista stałych wartości statycznych







Tablica ze wszystkimi wartościami typu Day


Variable z wartością konkretnego obiektu Day

privateklasy konstruktora Day- obiekty klasy konstruktora Daymogą być tworzone tylko w obrębie klasy Day.



Metoda ordinalmusi być wywołana na obiekcie Day.

Zwraca wartość obiektu - value.


Metoda zwraca statyczną tablicę ze wszystkimi wartościami klasDay

Jeśli usuniemy Daywszystkie statyczne metody i zmienne z klasy, otrzymamy następujący obraz:

Kod Notatka
public class Day
{
  private int value;

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

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


Zmienna valueprzechowuje wartość obiektu Day

Obiekty Daymożna tworzyć tylko w ramach klasy Day, konstruktora private.




Metoda ordinal()zwraca wartość valueobiektu Day.

Te. w zasadzie nic złego się tu nie dzieje. Kompilator tworzy klasę Day, następnie dodaje do niej stałe, które były wartościami y enum, dodaje brakujące metody i tworzy konstruktor klasy private. Jak działają konstruktorzy, przeanalizujemy nieco później.

Teraz myślimy, że jest jasne, dlaczego wprowadzamy wartość do zmiennej w ten sposób:

Day day = Day.MONDAY;

MONDAYjest tylko polem statycznym (stałym) pliku Day. A gdy mowa o statycznych metodach i polach spoza klasy, nazwa pola lub metody musi być poprzedzona nazwą klasy.



5. Więcej enummetod

Wszystkie -klasy enummają również kilka interesujących funkcji.

Konwertuj na ciąg iz powrotem

Aby przekonwertować obiekt wyliczeniowy na łańcuch, musisz wywołać jego toString().

String str = Day.MONDAY.toString();

Do odwrotnej konwersji (string to object Day) możesz użyć metody statycznej valueOf():

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

Bardzo wygodne i przydatne w wielu przypadkach.

Zamień na liczbę iz powrotem

enumWiesz już , jak przekonwertować obiekt typu na liczbę: aby to zrobić, musisz wywołać metodę ordinal():

int index = Day.MONDAY.ordinal();

Do odwrotnej konwersji (liczba na obiekt Day) musisz użyć bardziej autentycznej konstrukcji:

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

Przykłady:

Kod Notatka
Day day = Day.MONDAY;
int index = day.ordinal();
Day newDay = Day.values()[index+2];
Poniedziałek
Pobierz indeks poniedziałku (0)
Dzień tygodnia 2 dni później niż poniedziałek

Ważny punkt, ponieważ wartości typu enumsą ustalonym zbiorem stałych, można je porównać za pomocą ==. Cóż, nie mogą istnieć dwa identyczne obiekty MONDAYz różnymi odniesieniami. Każdy obiekt wartości wyliczeniowej ma tylko jedną instancję. Dlatego porównywanie zmiennych enum z == zawsze będzie działać.



6. Dodanie swoich metod doenum

Ponieważ enumw czasie kompilacji zamienia się w normalną klasę, możesz w niej zadeklarować metody: metody te zostaną po prostu dodane do klasy, którą wygeneruje kompilator. Na przykład chcemy, aby nasz zwracał nie tablicę wartości, ale listę.enum Day

Następnie możesz dodać do niego następujący kod:

Kod Notatka
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;
   }

}








Po liście wartości należy umieścić średnik.



Tworzymy obiekt ArrayList.

Dodajemy do niej wartości z tablicy: jest ona zwracana przez funkcję values().
Zwracamy listę.

Teraz tę metodę można wywołać w kodzie:

Kod Notatka
List<Day> list = Day.asList();
Zmienna listbędzie przechowywać listę wszystkich wartości enum'a Day.