Освой Kotlin играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Тот редкий случай, когда в Kotlin ключевое слово enum используется до ключевого слова class. В Kotlin enum относится к разряду мягких ключевых слов (soft keyword), которое является ключевым только перед ключевым словом class. В других случаях вы можете использовать его свободно как простое имя переменной.
// Документы кота: усы, лапы, хвост
enum class CatDocument {
VIBRISSAE, PAWS, TAIL
}
val paws = CatDocument.PAWS
println(paws)
Получить все значения перечисления. Мы можем получить как имя константы в перечислении, так и его значение с помощью встроенного свойства name. Порядковый номер можно получить через ordinal.
// получим все части документа
for (documentPart in CatDocument.values()){
println("name: ${documentPart.name}, ordinal: ${documentPart.ordinal}")
}
/*
name: VIBRISSAE, ordinal: 0
name: PAWS, ordinal: 1
name: TAIL, ordinal: 2
*/
Можем задать элементам перечисления значения.
// Enum with values
enum class Capital(val capital: String) {
Russia("Moscow"),
Ukraine("Kyiv"),
Belarus("Minsk")
}
val builder = StringBuilder()
builder.append("\nRussia = ${Capital.Russia.capital}")
builder.append("\nUkraine = ${Capital.Ukraine.capital}")
builder.append("\nBelarus = ${Capital.Belarus.capital}")
textView.text = builder.toString()
/*
Russia = Moscow
Ukraine = Kyiv
Belarus = Minsk
*/
Можно задать несколько значений.
// Enum with multiple values
enum class Country(val capital: String, val currency: String) {
Russia("Moscow", "Ruble"),
Ukraine("Kyiv", "Hryvnia"),
Belarus("Minks", "Belarusian ruble")
}
val builder = StringBuilder()
builder.append("\n\nRussia = ${Country.Russia.capital}, ${Country.Russia.currency}")
builder.append("\nUkraine = ${Country.Ukraine.capital}, ${Country.Ukraine.currency}")
builder.append("\nBelarus = ${Country.Belarus.capital}, ${Country.Belarus.currency}")
textView.text = builder.toString()
/*
Russia = Moscow, Ruble
и т.д.
*/
Можно задать значение по умолчанию.
enum class Cat(val catName: String, val gender: String? = "Кот") {
Vaska("Васька"),
Murzik("Мурзик"),
Murka("Мурка", "Кошка") // задаём собственное значение
}
val builder = StringBuilder()
builder.append("\n${Cat.Murzik.catName}, ${Cat.Murzik.gender}")
builder.append("\n${Cat.Vaska.catName}, ${Cat.Vaska.gender}")
builder.append("\n${Cat.Murka.catName}, ${Cat.Murka.gender}")
textView.text = builder.toString()
По умолчанию у всех котиков будет слово Кот и его указывать не нужно, а у Мурки мы задаём своё уникальное значение (Кошка).
В отличие от Java вы можете в перечислении задавать свойства и определять функции. Учебный пример от разработчиков языка.
enum class Color(
val r: Int, val g: Int, val b: Int
) {
RED(255, 0, 0), ORANGE(255, 165, 0),
YELLOW(255, 255, 0), GREEN(0, 255, 0), BLUE(0, 0, 255),
INDIGO(75, 0, 130), VIOLET(238, 130, 238);
fun rgb() = (r * 256 + g) * 256 + b
}
fun main(args: Array<String>) {
println(Color.BLUE.rgb())
}
В примере мы определили три отдельных переменных r, g, b, затем задали список перечислений и функцию для вычисления значения цвета. Обратите внимание, что в одном месте используется обязательная точка с запятой перед вызовом функции.