Работа с Enums в Котлине
1. обзор
В этом руководстве мы подробно рассмотрим перечисления Kotlin.
С развитием языков программирования использование и применение перечислений также продвинулись вперед.
Enum constants today aren’t just mere collections of constants - они могут иметь свойства, реализовывать интерфейсы и многое другое.
Для новичков в Kotlin ознакомьтесь с этой статьей об основах Kotlin -Introduction to the Kotlin Language.
2. Основные перечисления Kotlin
Давайте посмотрим на основы перечислений в Kotlin.
2.1. Определение перечислений
Давайте определим перечисление как имеющее три константы, описывающие типы кредитных карт:
enum class CardType {
SILVER, GOLD, PLATINUM
}
2.2. Инициализация констант Enum
Enums in Kotlin, just like in Java, can have a constructor. Поскольку константы перечисления являются экземплярами классаEnum, константы можно инициализировать, передав определенные значения конструктору.
Давайте укажем значения цвета для различных типов карточек:
enum class CardType(val color: String) {
SILVER("gray"),
GOLD("yellow"),
PLATINUM("black")
}
Мы можем получить доступ к значению цвета определенного типа карты с помощью:
val color = CardType.SILVER.color
3. Константы перечисления как анонимные классы
Мы можем определить конкретное поведение константы перечисления, создав их как анонимные классы. Затем константы должны переопределить абстрактные функции, определенные в определении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 class CardType : ICardLimit {
SILVER {
override fun getCreditLimit() = 100000
},
GOLD {
override fun getCreditLimit() = 200000
},
PLATINUM {
override fun getCreditLimit() = 300000
}
}
Чтобы получить доступ к кредитному лимиту типа карты, мы можем использовать тот же подход, что и в предыдущем примере:
val creditLimit = CardType.PLATINUM.getCreditLimit()
5. Общие конструкции перечисления
5.1. Получение констант Enum по имени
Чтобы получить константу перечисления по имениString, мы используем статическую функциюvalueOf():
val cardType = CardType.valueOf(name.toUpperCase())
5.2. Итерации по константам Enum
Чтобы перебрать все константы перечисления, мы используем статическую функциюvalues():
for (cardType in CardType.values()) {
println(cardType.color)
}
5.3. Статические Методы
Чтобы добавить «статическую» функцию к перечислению, мы можем использоватьcompanion object:
companion object {
fun getCardTypeByName(name: String) = valueOf(name.toUpperCase())
}
Теперь мы можем вызвать эту функцию с помощью:
val cardType = CardType.getCardTypeByName("SILVER")
Обратите внимание, что в Kotlin нет концепции методовstatic. Здесь мы показали способ получить ту же функциональность, что и в Java, но с использованием возможностей Kotlin.
6. Заключение
Эта статья представляет собой введение в перечисления на языке котлин и его основных особенностях.
Мы представили несколько простых концепций, таких как определение перечислений и инициализация констант. Мы также показали некоторые расширенные функции, такие как определение констант перечисления как анонимных классов и перечислений, реализующих интерфейсы.
Реализацию всех этих примеров и фрагментов кода можно найти вthe GitHub project. Это проект Maven, поэтому его легко импортировать и запускать как есть.