Перечисления с 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 — локальная установка не требуется.
Все уроки этого курса
- Определение перечислений
- Свойства и методы перечислений
- Перечисления с when
- Значения и порядковые номера перечислений