In Kotlin, le enumerazioni (enum class) consentono di dichiarare un insieme di valori limitati e allo stesso tempo di espanderli con metodi e proprietà.
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), indice (ordinal) e ottenere un elenco completo tramite values().== (identità), poiché gli elementi sono unici.È possibile definire un metodo astratto all'interno di un'enum class in Kotlin, come in Java, in modo che ogni elemento lo sovrascriva?
Risposta corretta: Sì, è possibile dichiarare un metodo astratto nello stile enum, e ogni elemento deve fornire la propria implementazione!
enum class State { START { override fun next() = RUNNING }, RUNNING { override fun next() = STOPPED }, STOPPED { override fun next() = STOPPED }; abstract fun next(): State }
Storia
Durante la migrazione da Java a Kotlin, il team ha tentato di ereditare una nuova enum class come una normale classe - si è scoperto che le enum non possono essere ereditate, compromettendo l'architettura. È stato necessario cambiare completamente l'approccio alla modularità delle macchine a stati.
Storia
Per memorizzare il valore nel database si utilizzava il nome dell'elemento (
enum.name), ma con il refactoring le enum sono state rinominate - i dati nel database hanno smesso di corrispondere alla nuova logica, c'è stata una perdita di coerenza (lo storage value pattern non è stato implementato).
Storia
Per serializzare un'enum class tramite Gson, è stato dimenticato di collegare il TypeAdapter personalizzato. In produzione, il servizio ha iniziato a restituire valori JSON errati, poiché il parser standard serializzava il campo sbagliato (ordinal o name), e la deserializzazione non corrispondeva tra i microservizi.