Centrum wiedzy o technologiach i pracy w IT
java enum

Java enum – wprowadzenie do typów wyliczeniowych

Ostatnia aktualizacja 16 maja, 2023

Ze względu na swoją elastyczność, enumy znajdują zastosowanie w różnych dziedzinach, takich jak wzorce projektowe, konwersje danych czy serializacja. Jak wygląda przykładowy Java enum? Sprawdź poniżej kilka opcji jego użycia w kodzie.

Nie udało się zapisać Twojej subskrypcji. Spróbuj ponownie.
Udało się! Widzimy się niebawem – newsletter wysyłamy w każdy wtorek

Otrzymuj za darmo unikalne poradniki, dane i wiedzę o pracy w IT – dostarczane co tydzień

Klikając “Zapisz mnie” wyrażasz zgodę na otrzymywanie e-maili od redakcji, a także ofert partnerów oraz akceptujesz naszą Politykę prywatności.

Enum – co to jest?

Java enum, czyli typ wyliczeniowy, to specjalny rodzaj klasy, który pozwala na definiowanie stałych o określonym typie. Enumy, oprócz posiadania stałych wartości, mogą mieć również pola, metody i konstruktory. W Javie od wersji 1.5 enumy stanowią łatwy i bezpieczny sposób na tworzenie zbiorów stałych, które są wykorzystywane w różnych częściach programu.

Sprawdź: Wzorce projektowe – czym są?

Java enum – podstawy

Definiowanie enumów

Aby zdefiniować enum, używamy słowa kluczowego “enum“, a następnie podajemy nazwę typu wyliczeniowego oraz stałe wartości oddzielone przecinkami. 

Przykład:

public enum Kierunek {
    POLNOC, WSCHOD, POLUDNIE, ZACHOD;
}

Użycie enumów

Enumy można stosować jako argumenty dla metod, w instrukcjach switch, a także jako elementy kolekcji.

Przykład użycia enuma Kierunek:

public void zmienKierunek(Kierunek kierunek) {
    switch (kierunek) {
        case POLNOC:
            // wykonaj akcje
            break;
        case WSCHOD:
            // wykonaj akcje
            break;
        case POLUDNIE:
            // wykonaj akcje
            break;
        case ZACHOD:
            // wykonaj akcje
            break;
    }
}

Pola, metody i konstruktory w enumach

Enumy mogą posiadać prywatne pola, metody oraz konstruktory, co pozwala na definiowanie dodatkowej logiki dla każdej stałej wartości. Dzięki temu, enumy mogą pełnić bardziej złożone funkcje i lepiej oddać intencje programisty.

Przykład enuma z konstruktorem:

public enum DniTygodnia {
    PONIEDZIALEK("Poniedziałek"),
    WTOREK("Wtorek"),
    SRODA("Środa"),
    CZWARTEK("Czwartek"),
    PIATEK("Piątek"),
    SOBOTA("Sobota"),
    NIEDZIELA("Niedziela");

    private String nazwa;

    DniTygodnia(String nazwa) {
        this.nazwa = nazwa;
    }

    public String getNazwa() {
        return nazwa;
    }
}

Iterowanie enumów

Aby przeiterować po wartościach enuma, można użyć metody values(), która zwraca tablicę wartości. 

Przykład:

for (DniTygodnia dzien : DniTygodnia.values()) {
    System.out.println(dzien.getNazwa());
}

Zobacz: Java Developer – kim jest i ile zarabia?

Porównywanie enumów

W poniższym przykładzie, dzien1 ma wartość DzienTygodnia.PONIEDZIALEK, a dzien2 ma wartość DzienTygodnia.SRODA. Porównanie tych dwóch wartości enuma odbywa się za pomocą operatora ‘==‘. W tym przypadku, dni są różne, więc program wypisze “Dni są różne.”.

public enum DzienTygodnia {
    PONIEDZIALEK, WTOREK, SRODA, CZWARTEK, PIATEK, SOBOTA, NIEDZIELA;
}

public class TestEnum {

    public static void main(String[] args) {
        DzienTygodnia dzien1 = DzienTygodnia.PONIEDZIALEK;
        DzienTygodnia dzien2 = DzienTygodnia.SRODA;

        if (dzien1 == dzien2) {
            System.out.println("Dni są takie same.");
        } else {
            System.out.println("Dni są różne.");
        }
    }
}

Konwersja string na enum

Czasami wartość enuma musi być konwertowana z łańcucha znaków. Aby to zrobić, można użyć metody valueOf():

String kierunekString = "WSCHOD";
Kierunek kierunek = Kierunek.valueOf(kierunekString);

Warto jednak pamiętać, że valueOf() może rzucić wyjątek IllegalArgumentException, jeśli wartość nie jest zgodna z żadną wartością enuma. W takim przypadku warto zastosować obsługę wyjątków.

Enum i serializacja

Enumy są automatycznie serializowalne, ponieważ implementują interfejs Serializable. Podczas deserializacji wartości enumów, nie są tworzone nowe obiekty, a zamiast tego używana jest referencja do istniejącego obiektu enum.

Przykład pokazujący serializację i deserializację enuma

‘DzienTygodnia.java’:

import java.io.Serializable;

public enum DzienTygodnia implements Serializable {
    PONIEDZIALEK, WTOREK, SRODA, CZWARTEK, PIATEK, SOBOTA, NIEDZIELA;
}

‘SerializacjaEnuma.java’:

import java.io.*;

public class SerializacjaEnuma {

    public static void main(String[] args) {
        DzienTygodnia dzien = DzienTygodnia.SRODA;

        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("dzienTygodnia.ser"))) {
            oos.writeObject(dzien);
            System.out.println("Serializacja zakończona pomyślnie.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

‘DeserializacjaEnuma.java’:

import java.io.*;

public class DeserializacjaEnuma {

    public static void main(String[] args) {
        DzienTygodnia dzien = null;

        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("dzienTygodnia.ser"))) {
            dzien = (DzienTygodnia) ois.readObject();
            System.out.println("Deserializacja zakończona pomyślnie.");
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }

        System.out.println("Dzień tygodnia po deserializacji: " + dzien);
    }
}

W powyższym przykładzie, najpierw serializujemy wartość enuma DzienTygodnia.SRODA do pliku dzienTygodnia.ser. Następnie odczytujemy wartość z tego pliku i deserializujemy ją do zmiennej dzien. Po deserializacji, wartość zmiennej dzien będzie taka sama jak przed serializacją (w tym przypadku DzienTygodnia.SRODA). Warto zauważyć, że podczas deserializacji nie jest tworzony nowy obiekt, ale zamiast tego używana jest referencja do istniejącego obiektu enum.

Enum i wzorce projektowe

Enumy są często stosowane w niektórych wzorcach projektowych, takich jak Singleton czy Strategia. 

Przykład implementacji wzorca Singleton z użyciem enum:

public enum SingletonEnum {
    INSTANCE;

    public void doSomething() {
        System.out.println("Wykonuję akcję");
    }
}

W powyższym przykładzie INSTANCE jest jedyną instancją typu SingletonEnum, co gwarantuje, że tylko jeden obiekt tego typu istnieje w całym programie.

Enumy a klasy

Instancje

Enumy i klasy w Javie mają wiele wspólnych cech, ale istnieją też istotne różnice. Najważniejszą z nich jest to, że enumy są ograniczone do określonego zestawu predefiniowanych instancji, które są zdefiniowane w momencie deklaracji enuma. Te instancje są globalnie dostępne jako stałe. W przeciwieństwie do zwykłych klas, nie możemy tworzyć nowych instancji enuma za pomocą operatora “new”.

Dziedziczenie

Enumy dziedziczą niejawnie po klasie java.lang.Enum, co oznacza, że nie mogą dziedziczyć po innej klasie, ale mogą implementować interfejsy. Zwykłe klasy mogą natomiast dziedziczyć po innej klasie i implementować dowolną liczbę interfejsów.

Metody

Enumy w Javie mają wbudowane metody, takie jak values(), ordinal() czy valueOf(), które nie są dostępne dla zwykłych klas. Dodatkowo, każdy enum jest niejawnie finalny, więc nie można go rozszerzyć, co jest możliwe w przypadku zwykłych klas.

Singleton

Enumy są bezpieczne pod względem wątków i gwarantują singleton dla swoich elementów, co sprawia, że są one często używane w projektowaniu wzorców typu Singleton. Zwykłe klasy nie zapewniają takiego zachowania domyślnie i wymagają dodatkowego kodu do obsługi wielowątkowości lub implementacji wzorca Singleton.

Podsumowanie

Enumy to funkcjonalne i elastyczne rozwiązanie do reprezentowania stałych wartości w programie. Ułatwiają one zarządzanie i organizację kodu, a także poprawiają jego czytelność. Dzięki różnorodności zastosowań, enumy stanowią istotny element języka Java.

Czytaj więcej:

Jak edytować PDF?

Pomysł na zdjęcie profilowe. Jak wybrać idealne zdjęcie na Facebooka?

Co potrafi Replika AI i dlaczego jej użytkownicy cierpią?

RWD to dziś konieczność. Co trzeba wiedzieć?

Heurystyki Nielsena. 10 zasad UX Designu

Total
0
Shares
_podobne artykuły