W Javie enum to typ klasowy, dziedziczący z java.lang.Enum, reprezentujący zestaw ograniczonych obiektów-stałych, ale nie ograniczający się jedynie do zestawu nazw: enum można rozszerzać metodami, polami, konstruktorem, implementować interfejsy i dodawać zachowanie.
Przykład:
enum Day { MONDAY("Dzień roboczy"), SATURDAY("Dzień wolny"); private String description; Day(String description) { this.description = description; } public String getDescription() { return description; } } Day d = Day.SATURDAY; System.out.println(d.getDescription()); // "Dzień wolny"
Niuanse:
Pytanie: "Czy można w enumie nadpisać metody dla niektórych wartości enum? Jeśli tak, to jak?"
Często się mylą: błędnie zakładają, że wszystkie wartości mają zawsze takie samo zachowanie.
Prawidłowa odpowiedź: Tak, możliwe są specyficzne realizacje dla poszczególnych stałych.
Przykład:
enum Operation { PLUS { double apply(double x, double y) { return x + y; } }, MINUS { double apply(double x, double y) { return x - y; } }; abstract double apply(double x, double y); }
Historia
W systemie rejestracji kierowców przechowywano statusy za pomocą enumów, nie zrealizowano dodatkowego pola dla kodu API — programiści próbowali rozszerzyć enum przez dziedziczenie, co jest zabronione. W rezultacie musieli przerobić model przechowywania statusów.
Historia
W sklepie internetowym programiści "rozpakowali" enum z prywatnym konstruktorem za pomocą narzędzia refleksyjnego, aby stworzyć fałszywą instancję do testów, ale otrzymali wyjątek: enum jest chroniony przed tworzeniem nowych instancji. CI nie przeszedł, testy się nie powiodły.
Historia
W jednym starym projekcie wartości enum porównywano przez equals(), a nie przez ==. Niespodziewanie podczas deserializacji pojawiły się problemy: wartości enum zawsze porównuje się przez ==, ponieważ są to singletony.