Прямые ссылки на публичные уроки для быстрого старта и стабильной индексации lesson-страниц.
enum — сокращение от enumeration (перечисление). Классы-перечисления используются, когда нужно перечислить объекты с заранее известными значениями — как правило, константы. enum полезен там, где сущность может принимать одно из фиксированного набора значений, и упрощает код, ограничивая количество возможных состояний.
В enum можно хранить как простые объекты, так и объекты с конкретными свойствами. Типичные примеры: дни недели, цвета с HEX-кодами, статусы процессов. Например, enum класс хранит статус готовки блюда в приложении доставки еды и его идентификатор. Когда сервер присылает известный id статуса, приложение сопоставляет его с данными enum и передаёт результат в методы отрисовки нужной информации для пользователя.
Класс-перечисление объявляется с ключевыми словами enum class, название — с заглавной буквы. Константы внутри пишутся в стиле UPPERCASE и разделяются запятыми.
enum class Status { NEW, COOKING, COMPLETED, }
Для имитации получения кодов статусов с сервера создадим целочисленный список и цикл, который раз в секунду обрабатывает очередной код:
fun main() { val statusesFromServer = listOf(101, 102, 103) for (i in statusesFromServer) { println(i) Thread.sleep(1000) } } enum class Status { NEW, COOKING, COMPLETED, }
При получении кода статуса нужно найти соответствующий объект enum и обработать его. Для этого создадим функцию setStatus(), принимающую тип Status, и внутри неё с помощью when выводим сообщение. Заодно добавим статус ERROR для обработки неизвестных кодов.
fun setStatus(status: Status) { when (status) { Status.NEW -> println("Заказ принят") Status.COOKING -> println("Заказ готовится") Status.COMPLETED -> println("Заказ готов") Status.ERROR -> println("Статус неизвестен") } }
В main() сопоставляем числовой код с объектом enum через when, ветку else отправляем в ERROR:
for (i in statusesFromServer) { when (i) { 101 -> setStatus(Status.NEW) 102 -> setStatus(Status.COOKING) 103 -> setStatus(Status.COMPLETED) else -> setStatus(Status.ERROR) } Thread.sleep(1000) }
В enum можно хранить произвольные свойства. Добавим конструктор с целочисленным полем id и пропишем коды прямо в перечислении. Для ERROR проставим 0 (либо можно сделать id нуллабельным со значением по умолчанию null). Теперь в when используем свойства enum-объектов вместо голых чисел:
fun main() { for (i in statusesFromServer) { when (i) { Status.NEW.id -> setStatus(Status.NEW) Status.COOKING.id -> setStatus(Status.COOKING) Status.COMPLETED.id -> setStatus(Status.COMPLETED) else -> setStatus(Status.ERROR) } Thread.sleep(1000) } } enum class Status(val id: Int) { NEW(101), COOKING(102), COMPLETED(103), ERROR(0), } fun setStatus(status: Status) { when (status) { Status.NEW -> println("Заказ принят") Status.COOKING -> println("Заказ готовится") Status.COMPLETED -> println("Заказ готов") Status.ERROR -> println("Статус неизвестен") } }
Помимо пользовательских свойств, у объектов enum доступны встроенные поля и функции:
name — имя объявленной константы в виде строкиordinal — порядковый номер константыvalues() — массив всех значений перечисленияprintln(Status.NEW.name) println(Status.COOKING.ordinal) for (i in Status.values()) println(i)
В enum классах можно объявлять функции. Если логика индивидуальна для каждого значения, метод делается абстрактным и реализуется в каждом объекте перечисления. Список констант при этом отделяется точкой с запятой:
enum class Status(val id: Int) { NEW(101) { override fun getStatusDescription(): String { return "Заказ создан и ожидает оплаты" } }, COOKING(102) { override fun getStatusDescription(): String { return "Заказ оплачен и начал готовиться" } }, COMPLETED(103) { override fun getStatusDescription(): String { return "Заказ готов, можете забирать" } }, ERROR(0) { override fun getStatusDescription(): String { return "Что-то пошло не так, мы уже разбираемся" } }; abstract fun getStatusDescription(): String }
println(Status.NEW.getStatusDescription()) println(Status.COOKING.getStatusDescription()) println(Status.COMPLETED.getStatusDescription())
В Kotlin функции без возвращаемого значения имеют тип Unit. Существует ещё один специальный тип — Nothing. Его возвращает функция TODO(), и он принципиально отличается от Unit: Nothing сообщает компилятору, что функция гарантированно не выполнится успешно — при вызове будет выброшено исключение NotImplementedError.
TODO() используется как заглушка в процессе разработки: можно объявить ряд функций без реализации и расставить TODO(), чтобы не забыть доделать их позже. В аргументах TODO() можно указать пояснение — оно отобразится в тексте исключения при запуске.
fun someUnfinishedFunction() { TODO("Реализовать логику обработки данных") }
TODO также работает как обычный комментарий — IntelliJ IDEA и Android Studio распознают его семантику и отображают все незакрытые пометки в специальной вкладке инструментов проекта.