En Kotlin, les énumérations (enum class) permettent de déclarer un ensemble de valeurs limitées tout en les étendant avec des méthodes et des propriétés.
enum class Direction { NORTH, SOUTH, WEST, EAST }
enum sont des singletons, des instances du sous-type correspondant de la classe.enum class Color(val rgb: Int) { RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF); fun containsRed() = (rgb and 0xFF0000 != 0) }
Color.RED.name), son index (ordinal) et obtenir la liste complète via values().== (identité), car les éléments sont uniques.Peut-on définir une méthode abstraite dans une enum class en Kotlin, comme en Java, afin que chaque élément la redéfinisse ?
Réponse correcte : Oui, il est possible de déclarer une méthode abstraite dans le style enum, et chaque élément doit fournir sa propre implémentation !
enum class State { START { override fun next() = RUNNING }, RUNNING { override fun next() = STOPPED }, STOPPED { override fun next() = STOPPED }; abstract fun next(): State }
Histoire
Lors de la migration de Java vers Kotlin, l'équipe a tenté d'hériter d'une nouvelle enum class comme d'une classe normale — il s'est avéré que l'enum ne peut pas être héritée, ce qui a rompu l'architecture. Il a fallu changer complètement l'approche concernant la modularité des machines à états.
Histoire
Pour stocker une valeur dans la base de données, ils prenaient le nom de l'élément (
enum.name), mais avec le refactoring, l'enum a renommer des éléments — les données de la base ne correspondaient plus à la nouvelle logique, il y a eu une perte de cohérence (le modèle de valeur de stockage n'a pas été mis en œuvre).
Histoire
Pour la sérialisation de l'enum class via Gson, ils ont oublié de connecter le TypeAdapter personnalisé. En production, le service a commencé à renvoyer des valeurs JSON incorrectes, car le parseur standard a sérialisé le mauvais champ (ordinal ou name), et la désérialisation ne correspondait pas entre les microservices.