Работа с Enums в Котлине

Работа с 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, поэтому его легко импортировать и запускать как есть.