Работа с Enums в Kotlin

1. Общ преглед

В този урок ще се потопим дълбоко в изброяванията на Kotlin.

С развитието на езиците за програмиране използването и приложението на enum също са напреднали.

Днес константите на Enum не са просто колекции от константи - те могат да имат свойства, да изпълняват интерфейси и много други.

За начинаещи Kotlin вижте тази статия за основите на Kotlin - Въведение в езика Kotlin.

2. Основни преброявания на Kotlin

Нека да разгледаме основите на преброяванията в Котлин.

2.1. Определяне на изброявания

Нека определим enum като три константи, описващи типовете кредитни карти:

enum class CardType { SILVER, GOLD, PLATINUM }

2.2. Инициализиране на Enum константи

Enums в Kotlin, точно както в Java, може да има конструктор. Тъй като enum константите са екземпляри на клас Enum , константите могат да бъдат инициализирани чрез предаване на конкретни стойности на конструктора.

Нека посочим цветовите стойности за различни типове карти:

enum class CardType(val color: String) { SILVER("gray"), GOLD("yellow"), PLATINUM("black") }

Можем да получим достъп до стойността на цвета на определен тип карта с:

val color = CardType.SILVER.color

3. Константи на Enum като анонимни класове

Можем да дефинираме специфично поведение на enum, като ги създаваме като анонимни класове. Тогава константите трябва да заменят абстрактните функции, дефинирани в дефиницията на Enum .

Например за всеки тип карта може да имаме различно изчисляване на връщането на пари.

Нека да видим как можем да го приложим:

enum class CardType { SILVER { override fun calculateCashbackPercent() = 0.25f }, GOLD { override fun calculateCashbackPercent() = 0.5f }, PLATINUM { override fun calculateCashbackPercent() = 0.75f }; abstract fun calculateCashbackPercent(): Float }

Можем да извикаме заменените методи на анонимните константни класове с:

val cashbackPercent = CardType.SILVER.calculateCashbackPercent()

4. Изброяващи интерфейси за внедряване

Да приемем, че има интерфейс ICardLimit, който определя лимитите на картите за различни типове карти:

interface ICardLimit { fun getCreditLimit(): Int }

Сега нека видим как нашият enum може да приложи този интерфейс:

enum class CardType : ICardLimit { SILVER { override fun getCreditLimit() = 100000 }, GOLD { override fun getCreditLimit() = 200000 }, PLATINUM { override fun getCreditLimit() = 300000 } }

За достъп до кредитния лимит от тип карта можем да използваме същия подход като в предишния пример:

val creditLimit = CardType.PLATINUM.getCreditLimit()

5. Общи конструкции на Enum

5.1. Получаване на Enum константи по име

За да получим enum константа от нейното име String , използваме статичната функция valueOf () :

val cardType = CardType.valueOf(name.toUpperCase())

5.2. Итерация чрез Enum константи

За да итерираме през всички enum константи, използваме статичната функция values ​​() :

for (cardType in CardType.values()) { println(cardType.color) }

5.3. Статични методи

За да добавим „статична“ функция към преброяване, можем да използваме придружаващ обект :

companion object { fun getCardTypeByName(name: String) = valueOf(name.toUpperCase()) }

Вече можем да извикаме тази функция с:

val cardType = CardType.getCardTypeByName("SILVER")

Имайте предвид, че Kotlin няма понятие за статични методи. Това, което показахме тук, е начин да получите същата функционалност като в Java, но използвайки функциите на Kotlin.

6. Заключение

Тази статия прави въведение към преброяването на език Kotlin и неговите ключови характеристики.

Въведохме няколко прости понятия като дефиниране на изброявания и инициализиране на константите. Също така показахме някои разширени функции като дефиниране на константи на преброяване като анонимни класове и преброяване, изпълняващи интерфейси.

Внедряването на всички тези примери и кодови фрагменти може да се намери в проекта GitHub. Това е проект на Maven, така че трябва да е лесно да се импортира и да се изпълнява както е.