In Kotlin ermöglichen Enumerationen (enum class) die Deklaration einer Menge begrenzter Werte und deren Erweiterung um Methoden und Eigenschaften.
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) zugegriffen werden, und die gesamte Liste kann über values() abgerufen werden.== (Identität) verglichen, da die Elemente einzigartig sind.Kann man in einer Enum-Klasse in Kotlin wie in Java eine abstrakte Methode definieren, sodass jedes Element sie überschreibt?
Richtige Antwort: Ja, man kann eine abstrakte Methode im Enum-Stil deklarieren, und jedes Element muss ihre eigene Implementierung bereitstellen!
enum class State { START { override fun next() = RUNNING }, RUNNING { override fun next() = STOPPED }, STOPPED { override fun next() = STOPPED }; abstract fun next(): State }
Geschichte
Bei der Migration von Java zu Kotlin versuchte das Team, eine neue Enum-Klasse wie eine normale Klasse zu vererben — es stellte sich heraus, dass Enums nicht vererbt werden können, was die Architektur verletzte. Der Ansatz zur Modularität von Zustandsmaschinen musste vollständig überdacht werden.
Geschichte
Um Werte in der Datenbank zu speichern, wurde der Name des Elements (
enum.name) verwendet, aber beim Refactoring wurden die Enum-Elemente umbenannt — die Daten in der Datenbank stimmten nicht mehr mit der neuen Logik überein, es gab einen Verlust der Konsistenz (das storage value pattern wurde nicht umgesetzt).
Geschichte
Für die Serialisierung der Enum-Klasse über Gson wurde vergessen, den benutzerdefinierten TypeAdapter zu verbinden. In der Produktion begann der Dienst, inkorrekte JSON-Werte auszugeben, weil der Standardparser nicht das korrekte Feld (ordinal oder name) serialisierte und die Deserialisierung zwischen den Mikrodiensten nicht übereinstimmte.