In Java is enum een klasse-type, afgeleid van java.lang.Enum, dat een set van beperkte objecten-constanten voorstelt, maar niet alleen beperkt is tot een set namen: enums kunnen worden uitgebreid met methoden, velden, een constructor, interfaces implementeren en gedrag toevoegen.
Voorbeeld:
enum Dag { MAANDAG("Werkdag"), ZATERDAG("Weekend"); private String beschrijving; Dag(String beschrijving) { this.beschrijving = beschrijving; } public String getBeschrijving() { return beschrijving; } } Dag d = Dag.ZATERDAG; System.out.println(d.getBeschrijving()); // "Weekend"
Bijzonderheden:
Vraag: "Kun je in een enum methoden voor sommige waarden van de enum overschrijven? Zo ja, hoe?"
Vaak fout: men veronderstelt ten onrechte dat het gedrag van alle waarden altijd hetzelfde is.
Correct antwoord: Ja, specifieke implementaties voor afzonderlijke constanten zijn mogelijk.
Voorbeeld:
enum Operatie { PLUS { double toepassen(double x, double y) { return x + y; } }, MINUS { double toepassen(double x, double y) { return x - y; } }; abstract double toepassen(double x, double y); }
Verhaal
In het systeem voor het bijhouden van automobilisten werden statussen in enums opgeslagen, maar er werd geen extra veld voor de API-code geïmplementeerd — ontwikkelaars probeerden de enum te verlengen via overerving, wat verboden is. Uiteindelijk moesten ze het opslagmodel van statussen herschrijven.
Verhaal
In een internetwinkel "depaketeerden" programmeurs de enum met een private constructor via een reflection-tool om een valse instantie voor tests te creëren, maar kregen een Exception: enums zijn beschermd tegen het creëren van nieuwe instanties. CI slaagde niet, de tests faalden.
Verhaal
In een oud project werden de waarden van de enum vergeleken met equals(), en niet met ==. Verrassend genoeg ontstonden er problemen bij deserialisatie: enum waarden worden altijd vergeleken met ==, omdat dit singletons zijn.