programowanieJava Senior Developer

Jak działają enumy w Javie, jakie są związane z nimi niuanse i dlaczego enum to nie tylko prosta zbiór stałych?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

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:

  • Enum gwarantuje unikalność stałych: instancje singletony.
  • Można implementować interfejsy.
  • Każda wartość posiada własną klasę (można nadpisywać metody dla każdej wartości).
  • Enum jest chroniony przed klonowaniem i tworzeniem nowych instancji przez refleksję.

Pytanie podchwytliwe

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); }

Przykłady rzeczywistych błędów z powodu braku znajomości niuansów tematu


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.