In Kotlin stellen enumeraties (enum class) je in staat om een set van beperkte waarden te declareren en deze uit te breiden met methoden en eigenschappen.
enum class Direction { NORTH, SOUTH, WEST, EAST }
enum class Color(val rgb: Int) { RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF); fun containsRed() = (rgb and 0xFF0000 != 0) }
Color.RED.name), index (ordinal) en je kunt de volledige lijst krijgen via values().== (identity), omdat de elementen uniek zijn.Is het mogelijk om een abstracte methode binnen een enum-class in Kotlin te definiëren, net als in Java, zodat elk element deze kan overschrijven?
Juiste antwoord: Ja, het is mogelijk om een abstracte methode in enum-stijl te declareren, en elk element is verplicht om zijn eigen implementatie te geven!
enum class State { START { override fun next() = RUNNING }, RUNNING { override fun next() = STOPPED }, STOPPED { override fun next() = STOPPED }; abstract fun next(): State }
Verhaal
Bij de migratie van Java naar Kotlin probeerde het team een nieuwe enum-class te erven zoals een gewone klasse — het bleek dat enums niet kunnen worden geërfd, wat de architectuur verstoorde. Er moest een volledige verandering van aanpak voor modulaire state machines plaatsvinden.
Verhaal
Voor het opslaan van waarden in de database namen ze de naam van het element (
enum.name), maar met de refactoring werden de enums hernoemd — de gegevens in de database voldeden niet meer aan de nieuwe logica, wat resulteerde in verlies van consistentie (storage value pattern was niet geïmplementeerd).
Verhaal
Voor de serialisatie van de enum-class via Gson vergaten ze de aangepaste TypeAdapter te koppelen. In productie begon de dienst onjuiste JSON-waarden terug te geven, omdat de standaardparser niet het juiste veld (ordinal of name) serialiseerde, en de deserialisatie verschilde tussen microservices.