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, така че трябва да е лесно да се импортира и да се изпълнява както е.