Ostatnia aktualizacja 14 kwietnia, 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.
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.
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()); }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ę dzięki 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ć, iż valueOf() może rzucić wyjątek IllegalArgumentException, jeżeli 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ć, iż 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, iż tylko jeden obiekt tego typu istnieje w całym programie.
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.