Kotlin, являясь мощным современным языком программирования, дает возможность разработчикам создавать эффективный и читаемый код. Одна из таких фич это перечисления - Enum classes - тип данных, который позволяет определить множество именованных констант. В этой статье рассмотрим различные примеры использования enum, которые помогут эффективнее применять этот инструмент в своих проектах.

Enum Classes

Enum классы в Kotlin это удобный способ представить множество констант. Они позволяют определить тип с конечным сетом значений.

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

enum class DayOfWeek {
   MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

Теперь мы можем обратиться к enum из другого участка кода:

fun getWeekendDays(): List<DayOfWeek> {
   return listOf(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY)
}

Enum Properties

Enum классы в Kotlin также могут обладать полями или свойствами. Это позволяет добавить дополнительную информацию о каждой константе в перечислении. 

В нашем примере добавим свойство к DayOfWeek, которое определяет номер дня недели:

enum class DayOfWeek(val number: Int) {
   MONDAY(1),
   TUESDAY(2),
   WEDNESDAY(3),
   THURSDAY(4),
   FRIDAY(5),
   SATURDAY(6),
   SUNDAY(7)
}

Теперь мы можем обратиться к свойству enum:

fun getDayNumber(day: DayOfWeek): Int {
   return day.number
}

Enum Methods

Еще Enum классы в Kotlin могут иметь методы. С ними можно добавить дополнительную функциональность каждой константе enum

В примере с днями недели добавим метод который возвращает true если это выходной false если рабочий день.

enum class DayOfWeek(val number: Int) {
   MONDAY(1),
   TUESDAY(2),
   WEDNESDAY(3),
   THURSDAY(4),
   FRIDAY(5),
   SATURDAY(6),
   SUNDAY(7);

   fun isWeekend(): Boolean {
   	return this == SATURDAY || this == SUNDAY
   }
}

Теперь мы можем вызывать метод enum:

fun printDayType(day: DayOfWeek) {
   if (day.isWeekend()) {
   	println("$day is a weekend day.")
   } else {
   	println("$day is a weekday.")
   }
}

Enum Constructors

Enum классы в Kotlin могут иметь конструкторы. Конструкторы предоставляют дополнительные данные для каждой константы в момент инициализации.

В нашем примере определим конструктор, который добавляет displayName для каждого дня недели

enum class DayOfWeek(val number: Int, val displayName: String) {
   MONDAY(1, "Monday"),
   TUESDAY(2, "Tuesday"),
   WEDNESDAY(3, "Wednesday"),
   THURSDAY(4, "Thursday"),
   FRIDAY(5, "Friday"),
   SATURDAY(6, "Saturday"),
   SUNDAY(7, "Sunday");

   override fun toString(): String {
   	return displayName
   }
}

Теперь мы можем использовать displayName для печати константы.


fun printDayName(day: DayOfWeek) {
   println("The day of the week is ${day.displayName}")
}

Enum Extensions

Как и для обычного класса, для Enum классов в Kotlin возможно написать расширение. Таким образом, мы получаем экстеншен функцию которая не определена в исходном перечислении.

В нашем примере расширим enum методом, который вернет следующий день недели

fun DayOfWeek.nextDay() = DayOfWeek.values()[(ordinal + 1) % 7]

Теперь мы можем вызывать расширение enum:

fun printNextDay(day: DayOfWeek) {
   println("The next day is ${day.nextDay()}")
}

Перечисления в Kotlin это мощная функциональность по созданию сета именованных констант. Они используются для упрощения и улучшения читаемости кода, а также для расширения функционала имеющегося. Применяя весь спектр возможностей enum, можно создавать лаконичный и эффективный код, который будет легко понять и поддерживать.

Комментарии (4)


  1. ExTalosDx
    18.04.2023 12:03
    +12

    Я, конечно, рад подробным статьям про интересные технологии, но это же всё есть в русскоязычной документации (и при том официальной).

    Когда я заходил в статью я думал, что здесь будут показаны хитрости использования sealed классов, в качестве enum. Или какому-нибудь магический трюк с sealed inline классами.

    Enum в Kotlin работает ровно так же, как и в Java, в чем смысл статьи так и не увидел.

    Лучше расскажите, как использовать ktor + koin, как замену Spring, было бы очень интересно посмотреть на решение типовых проблем в виде сравнения этих фреймворков.


    1. a1eksei Автор
      18.04.2023 12:03

      Согласен, что почти все можно найти в официальной документации.
      Но ценность статьи, как мне кажется, раскрыть на конкретном примере полезность и варианты применения enum в Kotlin (и отчасти в Java), чего не хватает в переводе документации.
      И поскольку здесь действительно нет чего-то сложного и достаточно глубокого, поставил уровень статьи Простой.


  1. 0Naron0
    18.04.2023 12:03

    Про abstract fun не написал, можно заставить переопределять метод в каждом элементе перечисления.


  1. Lezenford
    18.04.2023 12:03

    Не указана исключительно котлин фича с енамами - у них есть неявный базовый класс на основе которого можно строить функции расширения и дженерики.