1. Tło wygląduenum
Dzisiaj poznamy inny rodzaj typów danych w Javie - enum
. Nazwa enum
pochodzi 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ść 8
lub 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 enum
nastę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 enum
dla typu ДеньНедели
:
Kod | Notatka |
---|---|
|
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 |
---|---|
|
Na ekranie pojawi się:
|
3. enum
Metody
Typ enum
ma kilka wbudowanych metod, dwie z nich są bardzo interesujące:
Metoda statyczna values()
zwraca tablicę wszystkich wartości typu enum
:
Kod | Notatka |
---|---|
|
W zmiennej przechowywana jest days tablica wartości typu Day (7 sztuk) Zawartość tablicy wyświetlamy na ekranie:
|
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 |
---|---|
|
|
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 Day
zostanie przekonwertowana na zwykłą klasę:
Kod, wersja uproszczona | Notatka |
---|---|
|
Klasa Day Lista stałych wartości statycznych Tablica ze wszystkimi wartościami typu Day Variable z wartością konkretnego obiektu Day private klasy konstruktora Day - obiekty klasy konstruktora Day mogą być tworzone tylko w obrębie klasy Day . Metoda ordinal musi być wywołana na obiekcie Day . Zwraca wartość obiektu - value . Metoda zwraca statyczną tablicę ze wszystkimi wartościami klas Day |
Jeśli usuniemy Day
wszystkie statyczne metody i zmienne z klasy, otrzymamy następujący obraz:
Kod | Notatka |
---|---|
|
Zmienna value przechowuje wartość obiektu Day Obiekty Day można tworzyć tylko w ramach klasy Day , konstruktora private . Metoda ordinal() zwraca wartość value obiektu 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;
MONDAY
jest 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 enum
metod
Wszystkie -klasy enum
mają 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
enum
Wiesz 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 |
---|---|
|
Poniedziałek Pobierz indeks poniedziałku (0) Dzień tygodnia 2 dni później niż poniedziałek |
Ważny punkt, ponieważ wartości typu enum
są ustalonym zbiorem stałych, można je porównać za pomocą ==. Cóż, nie mogą istnieć dwa identyczne obiekty MONDAY
z 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ż enum
w 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 |
---|---|
|
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 |
---|---|
|
Zmienna list będzie przechowywać listę wszystkich wartości enum 'a Day . |
GO TO FULL VERSION