W Kotlinie enumeracje (enum class) umożliwiają zadeklarowanie zbioru ograniczonych wartości, przy jednoczesnym rozszerzeniu ich metodami i właściwościami.
enum class Direction { NORTH, SOUTH, WEST, EAST }
enum to singletony, instancje odpowiedniego podtypu klasy.enum class Color(val rgb: Int) { RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF); fun containsRed() = (rgb and 0xFF0000 != 0) }
Color.RED.name), indeksie (ordinal) i uzyskiwać pełną listę za pomocą values().== (tożsamość), ponieważ elementy są unikalne.Czy można zdefiniować metodę abstrakcyjną wewnątrz klasy enum w Kotlinie, tak jak w Javie, aby każdy element ją nadpisywał?
Prawidłowa odpowiedź: Tak, można zadeklarować metodę abstrakcyjną w stylu enum, a każdy element musi dostarczyć swoją implementację!
enum class State { START { override fun next() = RUNNING }, RUNNING { override fun next() = STOPPED }, STOPPED { override fun next() = STOPPED }; abstract fun next(): State }
Historia
Przy migracji z Javy do Kotlinu zespół próbował dziedziczyć nową klasę enum jak zwykłą klasę — okazało się, że klasy enum nie można dziedziczyć, co naruszyło architekturę. Trzeba było całkowicie zmienić podejście do modularności maszyn stanowych.
Historia
Do przechowywania wartości w bazie danych brano nazwę elementu (
enum.name), ale przy refaktoryzacji enum zmieniono nazwy elementów — dane z bazy przestały odpowiadać nowej logice, nastąpiła utrata spójności (wzorzec wartości przechowywania nie został wdrożony).
Historia
Przy serializacji klasy enum przez Gson zapomniano podłączyć niestandardowy TypeAdapter. W produkcji usługa zaczęła zwracać nieprawidłowe wartości JSON, ponieważ standardowy parser serializował niewłaściwe pole (ordinal lub name), a deserializacja nie zgadzała się między mikroserwisami.