0Pricing
Kotlin Academy · Урок

Перечисления с when

Обрабатывайте все варианты

«Перечисления с when» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.

Перечисления и условные выражения

Выражение when естественным образом подходит для ветвления по перечислению. Для каждой константы создаётся собственная ветвь.

enum class Light { RED, YELLOW, GREEN }

fun action(l: Light) = when (l) {
    Light.RED -> "Stop"
    Light.YELLOW -> "Slow"
    Light.GREEN -> "Go"
}

fun main() {
    println(action(Light.GREEN))
}

Полнота вариантов

Если when используется как выражение для перечисления и охватывает все константы, ветвь else не нужна. Компилятор проверяет полноту вариантов.

enum class Coin { HEADS, TAILS }

fun flip(c: Coin) = when (c) {
    Coin.HEADS -> "Win"
    Coin.TAILS -> "Lose"
}

fun main() {
    println(flip(Coin.HEADS))
}

Компилятор Вас подстрахует

Если позже добавить новую константу, но забыть соответствующую ветвь, компилятор сообщит об ошибке. Благодаря этому перечисления и when безопасно изменять.

enum class Size { S, M, L }

fun label(s: Size) = when (s) {
    Size.S -> "Small"
    Size.M -> "Medium"
    Size.L -> "Large"
}

fun main() {
    println(label(Size.M))
}

Импорт констант

Можно импортировать члены перечисления, чтобы убрать префикс типа внутри when и сделать ветви короче.

enum class Dir { UP, DOWN }

import Dir.UP
import Dir.DOWN

fun move(d: Dir) = when (d) {
    UP -> "y + 1"
    DOWN -> "y - 1"
}

fun main() {
    println(move(Dir.UP))
}

Объединение ветвей

Несколько констант могут использовать одну ветвь, если перечислить их через запятую.

enum class Day { MON, TUE, WED, SAT, SUN }

fun kind(d: Day) = when (d) {
    Day.SAT, Day.SUN -> "Weekend"
    else -> "Weekday"
}

fun main() {
    println(kind(Day.SAT))
}

Возврат разных типов

Каждая ветвь может выдавать значение; всё выражение when становится этим значением.

enum class Tier { FREE, PRO }

fun limit(t: Tier): Int = when (t) {
    Tier.FREE -> 10
    Tier.PRO -> 1000
}

fun main() {
    println(limit(Tier.PRO))
}

when без аргумента

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

enum class Mood { HAPPY, SAD }

fun emoji(m: Mood) = when (m) {
    Mood.HAPPY -> ":)"
    Mood.SAD -> ":("
}

fun main() {
    println(emoji(Mood.HAPPY))
}

Побочные эффекты в ветвях

Ветви могут выполнять инструкции, а не только возвращать значения.

enum class Cmd { START, STOP }

fun run(c: Cmd) {
    when (c) {
        Cmd.START -> println("Starting...")
        Cmd.STOP -> println("Stopping...")
    }
}

fun main() {
    run(Cmd.START)
}

По возможности избегайте else

Использование else отключает проверку полноты вариантов: новая константа незаметно попадёт в else. Для перечислений предпочтительнее явные ветви.

enum class State { ON, OFF }

fun text(s: State) = when (s) {
    State.ON -> "on"
    State.OFF -> "off"
}

fun main() {
    println(text(State.OFF))
}

Реалистичный маршрутизатор

Сопоставление ролей пользователей с разрешениями — удачный пример использования полного выражения when.

enum class Role { ADMIN, USER, GUEST }

fun canDelete(r: Role) = when (r) {
    Role.ADMIN -> true
    Role.USER -> false
    Role.GUEST -> false
}

fun main() {
    println(canDelete(Role.ADMIN))
}

Сочетание со свойствами

Можно выполнять ветвление по перечислению и одновременно использовать его свойства внутри ветвей.

enum class Coin(val cents: Int) { PENNY(1), DIME(10) }

fun describe(c: Coin) = when (c) {
    Coin.PENNY -> "Worth ${c.cents}"
    Coin.DIME -> "Worth ${c.cents}"
}

fun main() {
    println(describe(Coin.DIME))
}

Быстрая проверка

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

Повторение

Вы научились сочетать перечисления с when:

  • when для перечисления может быть полным и не содержать else.
  • Компилятор требует охватить все константы.
  • Объединяйте константы запятыми; каждая ветвь выдаёт значение.
  • Избегайте else, чтобы сохранить безопасность проверки полноты вариантов.
enum class Light { RED, GREEN }

fun go(l: Light) = when (l) {
    Light.RED -> false
    Light.GREEN -> true
}

fun main() {
    println(go(Light.GREEN))
}

Часто задаваемые вопросы

Урок «Перечисления с when» бесплатный?

Да — полный текст урока «Перечисления с when» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.

Чему я научусь в уроке «Перечисления с when»?

Обрабатывайте все варианты Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Kotlin Academy?

Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Перечисления с when»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Kotlin Academy?

Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Определение перечислений
  2. Свойства и методы перечислений
  3. Перечисления с when
  4. Значения и порядковые номера перечислений
← Назад к Kotlin Academy