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 |
|---|---|
|
Nowy typ DayPoniedział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. 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 |
|---|---|
|
W zmiennej przechowywana jest daystablica 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 Dayzostanie przekonwertowana na zwykłą klasę:
| Kod, wersja uproszczona | Notatka |
|---|---|
|
Klasa DayLista stałych wartości statycznych Tablica ze wszystkimi wartościami typu DayVariable z wartością konkretnego obiektu Dayprivateklasy 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 klas Day |
Jeśli usuniemy Daywszystkie statyczne metody i zmienne z klasy, otrzymamy następujący obraz:
| Kod | Notatka |
|---|---|
|
Zmienna valueprzechowuje wartość obiektu DayObiekty 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 |
|---|---|
|
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 |
|---|---|
|
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 listbędzie przechowywać listę wszystkich wartości enum'a Day. |
GO TO FULL VERSION