Классы перечислений - enum
Перечисления – это особая разновидность классов в Kotlin, их объявление начинается со слова enum
. В простейшем случае класс перечисления содержит лишь список констант.
enum class Fruits { BANANA, APPLE, ORANGE, KIWI }
Значение каждой константы представляет собой объект, созданный от своего класса-перечисления. Доступ к нему получаем через имя класса и константы.
fun main() { val orange: Fruits = Fruits.ORANGE println(orange) // ORANGE println(orange.name) // ORANGE println(orange.ordinal) // 2 }
У каждого объекта есть порядковый номер – индекс. Другими словами, объекты класса перечисления упорядочены.
Объекты-значения могут иметь свойства, которые перечисляются в скобках и по сути являются аргументами для конструктора.
enum class Fruits { BANANA(10, 0.9), APPLE(12, 1.1), ORANGE(5, 1.5), KIWI(15, 1.8); var qty: Int var price: Double constructor(q: Int, p: Double) { qty = q price = p } }
fun main() { println(Fruits.ORANGE.qty) // 5 }
То же самое с первичным конструктором и созданием свойств в заголовке класса:
enum class Fruits( var qty: Int, var price: Double) { BANANA(10, 0.9), APPLE(12, 1.1), ORANGE(5, 1.5), KIWI(15, 1.8); }
Кроме свойств, также как обычные классы, перечисления могут содержать методы.
enum class Fruits( var qty: Int, var price: Double) { BANANA(10, 0.9), APPLE(12, 1.1), ORANGE(5, 1.5), KIWI(15, 1.8); fun sell(n: Int) {qty -= n} fun changePrice(newPrice: Double) { price = newPrice } }
fun main() { val o = Fruits.ORANGE println("${o.qty}, ${o.price}") // 5, 1.5 o.sell(3) o.changePrice(1.3) println("${o.qty}, ${o.price}") // 2, 1.3 }
С помощью функции values()
получают массив всех объектов класса.
fun main() { for (i in Fruits.values()) i.changePrice(0.2) }
В Kotlin можно импортировать константы из класса-перечисления. В этом случае обращение идет без имени класса.
import Fruits.* fun main() { println(ORANGE.qty) }
PDF-версия курса с дополнительными уроками