ProgrammatieKotlin ontwikkelaar

Beschrijf het mechanisme van enum-klassen in Kotlin: wat is een enum class, wat is het verschil met Java, wat zijn de kenmerken en beperkingen van enums, hoe voeg je eigen functionaliteit toe, welke nuances kunnen optreden bij serialisatie en vergelijking. Geef een voorbeeld.

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

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.

Belangrijkste punten:

  • De enum-class wordt vergelijkbaar met Java gedeclareerd, maar de syntaxis is strikter:
    enum class Direction { NORTH, SOUTH, WEST, EAST }
  • Enum-elementen zijn singletonen, instanties van de overeenkomstige subtype van de klasse.
  • Je kunt aanvullende eigenschappen en methoden binnen een enum definiëren:
    enum class Color(val rgb: Int) { RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF); fun containsRed() = (rgb and 0xFF0000 != 0) }
  • Elk waarde is toegankelijk op naam (Color.RED.name), index (ordinal) en je kunt de volledige lijst krijgen via values().
  • In Kotlin kun je geen enum-klassen erven, maar je kunt interfaces implementeren.
  • Het verschil met Java is dat je geen klassen expliciet van enum kunt erven, verdiepend gebruik van geneste lijsten is niet mogelijk;
  • Enums in Kotlin worden niet standaard geserialiseerd met behulp van standaardtools (zoals Gson of Jackson) — speciale adapters/annotaties zijn nodig.

Vergelijking van enums:

  • Enums worden vergeleken via == (identity), omdat de elementen uniek zijn.
  • Bij serialisatie kunnen namen veranderen, het is beter om expliciet waarden te definiëren (storage value pattern).

Tegenvraag.

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 }

Voorbeelden van echte fouten door gebrek aan kennis van de details van het onderwerp.


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.