Перечисления Kotlin используются для описания набора предопределенных констант в вашем коде. Но что именно это означает? Когда вы моделируете свой код, некоторые концепции будут иметь ограниченный набор возможностей. Например, результатом операции может быть либо «УСПЕХ», либо «НЕУДАЧА».

В этой статье мы обсудим

Что такое перечисления?
Как создавать перечисления в Kotlin?
Как использовать перечисления и их свойства?

Создайте файл Kotlin и определите новый класс перечисления Days.

enum class Days {
 // Enums will be declared here
}

Теперь замените комментарий, добавив список констант, разделенных запятыми. Итак, класс enum будет

enum class Days {
 Sunday,
 Monday,
 Tuesday,
 Wednesday,
 Thursday,
 Friday,
 Saturday;
}

Теперь перебираем все константы перечисления

for (day in Days.values()) {
 println(“Day ${day.ordinal}: ${day.name}”)
}

он должен напечатать следующий вывод:

Day 0: Sunday
Day 1: Monday
Day 2: Tuesday
Day 3: Wednesday
Day 4: Thursday
Day 5: Friday
Day 6: Saturday
  1. Сопутствующая функция values() в классе enum дает вам список всех объявленных констант в классе.
  2. Порядковое свойство каждой константы дает индекс этой константы в списке объявленных констант.
  3. Свойство name каждой константы принимает имя константы в коде и возвращает строковое значение этого имени.

Каждое значение константы является экземпляром класса перечисления, поэтому мы можем использовать другие функции, такие как получение константы на основе целочисленного индекса. Например,

val index = 3
val dayAtIndex = Days.values()[index]
println(“${dayAtIndex.name}”)

он должен напечатать следующий вывод:

Wednesday

Как и другие классы, классы enum могут иметь свойства. Мы даже можем установить их, передав значение в конструкторе. Например, если мы хотим, чтобы день был выходным, добавьте в конструктор логическое свойство, например:

enum class Days(val isWeekend: Boolean) {
 ……………
}

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

Sunday(true),
Monday(false),
Tuesday(false),
Wednesday(false),
Thursday(false),
Friday(false),
Saturday(true);

Давайте проверим, является ли день выходным или нет

for (day in Days.values()) {
 println(“${day.name} is weekend: ${day.isWeekend}”)
}

он должен напечатать следующий вывод

Sunday, is weekend: true
Monday, is weekend: false
Tuesday, is weekend: false
Wednesday, is weekend: false
Thursday, is weekend: false
Friday, is weekend: false
Saturday, is weekend: true

Мы также можем использовать значение по умолчанию в конструкторе так же, как мы можем использовать его с другими классами. Поэтому обновите конструктор, чтобы значение isWeekend по умолчанию было false:

enum class Days(val isWeekend: Boolean = false) {
  …………………
}

Теперь мы можем удалить (false) off для всех дней, кроме выходных, так как это значение параметра isWeekend по умолчанию.

Sunday(true),
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday(true);

Теперь мы получим точно такой же результат, как и раньше.

Как и другие классы в Kotlin, классы enum также могут иметь методы.

fun dayName(day : Days): String {
    return day.name
}

Как и другие классы в Kotlin, классы enum могут иметь сопутствующие объекты для выполнения действий, не зависящих от конкретного экземпляра класса.

companion object {
   fun today() {
    val dayOfWeek = Calendar.getInstance().get(Calendar.DAY_OF_WEEK)
    println(“$calendarDayOfWeek”)
   }
}

Таким образом, полный код класса enum Days выглядит следующим образом:

enum class Days(val isWeekend: Boolean = false) {
  Sunday(true),
  Monday,
  Tuesday,
  Wednesday,
  Thursday,
  Friday,
  Saturday(true);
  fun dayName(day : Days): String {
    return day.name
  }
  companion object {
    fun today() {
     val dayOfWeek = 
        Calendar.getInstance().get(Calendar.DAY_OF_WEEK)
     println(“$calendarDayOfWeek”)
     }
   } 
}

Одной из самых мощных функций классов enum является то, как они сочетаются с выражением when.

when (day) {
 Days.Sunday -> println(“1st day of the week”)
 Days.Saturday -> println(“Last day of the week”)
 else -> println(“Other day of the week”)
}

Мы можем создавать анонимные классы для определения конкретных констант перечисления. В отличие от Java, классы перечисления Kotlin поддерживают анонимные классы.

enum class Days {
   Sunday {
      override fun isWeekend() = true
   }, 
   Monday {
      override fun isWeekend() = false
   },
   Tuesday {
      override fun isWeekend() = false
   },
   Wednesday {
      override fun isWeekend() = false
   },
   Thursday {
      override fun isWeekend() = false
   },
   Friday {
      override fun isWeekend() = false
   },
   Saturday {
      override fun isWeekend() = true
   };
   override fun isWeekend() = Boolean
}

В приведенном выше примере каждая константа перечисления создается путем объявления собственных анонимных классов при переопределении требуемого абстрактного метода.

Хотя классы перечисления Kotlin не могут быть производными от класса, класса перечисления или абстрактного класса, они могут реализовывать один или несколько интерфейсов.

interface DaysInterface {
   fun firstDay(): Days
}
enum class Days: DaysInterface {
   Sunday,
   Monday,
   Tuesday,
   Wednesday,
   Thursday,
   Friday,
   Saturday;
    override fun firstDay(): Days {
      return Sunday
    } 
}

Заключение

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