Kotlin в IntelliJ IDEA Kotlin змінні Kotlin типи даних Kotlin операції з числами Kotlin умовні вирази Kotlin умовні конструкції Kotlin цикли Kotlin послідовності Kotlin масиви Kotlin функціональне програмування Kotlin змінна кількість параметрів. Vararg Kotlin повернення результату. оператор return Kotlin однорядкові і локальні функції Kotlin перевантаження функцій Kotlin Лямбда-вирази Kotlin функції вищого порядку Kotlin Анонімні функції Kotlin ООП Класи і об'єкти Kotlin ООП властивості Kotlin ООП конструктор Kotlin ООП функції в класах Kotlin ООП Пакети та імпорт Kotlin ООП модифікатори видимості Kotlin ООП вкладені класи Kotlin ООП інтерфейси Kotlin ООП спадкування Kotlin ООП Перевизначення методів і властивостей Kotlin ООП Абстрактні класи та методи Kotlin ООП Data-класи Kotlin ООП перерахування enums Kotlin ООП Null і nullable-типи Kotlin ООП Обробка винятків Kotlin ООП перетворення типів Kotlin ООП Інфіксна функція Kotlin ООП функції розширення Kotlin ООП Узагальнені класи і функції Kotlin ООП обмеження узагальнень Kotlin ООП Варіантність, коваріантність і контраваріантність Kotlin Колекції. Змінювані і незмінні колекції Kotlin Колекції. LIST список Kotlin Колекції. Set Kotlin Колекції. Map

Kotlin ООП перерахування enums


Enums або перерахування представляють тип даних, який дозволяє визначити набір логічно пов'язаних констант. Для визначення перерахування застосовуються ключові слова enum class . Наприклад, визначимо перелік:

enum class Day{
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

Дане перерахування Day представляє день тижня. Усередині перерахування визначаються константи. В даному випадку це назви семи днів тижня. Константи визначаються через кому. Кожна константа фактично являє об'єкт даного перерахування.

fun main(args: Array<String>) {
 
    val day: Day = Day.FRIDAY
    println(day)            // FRIDAY
    println(Day.MONDAY)     // MONDAY
}

Класи перерахувань як і звичайні класи також можуть мати конструктор. Крім того, для констант перерахування також може викликатися конструктор для їх ініціалізації.

enum class Day(val value: Int){
    MONDAY(1), TUESDAY(2), WEDNESDAY(3),
    THURSDAY(4), FRIDAY(5), SATURDAY(6), SUNDAY(100500)
}
 
fun main(args: Array<String>) {
 
    val day: Day = Day.FRIDAY
    println(day.value)        // 5
    println(Day.MONDAY.value) // 1
}

В наведеному вище прикладі у класу перерахування через конструктор визначається властивість value. Відповідно при визначенні констант перерахування необхідно кожну з цих констант форматувати, передавши значення для властивості value.

При цьому перерахування - це не просто список значень. Вони можуть визначати також властивості і функції. Але якщо клас перерахування містить властивості або функції, то константи повинні бути відокремлені крапкою з комою.

enum class Day(val value: Int){
    MONDAY(1), TUESDAY(2), WEDNESDAY(3),
    THURSDAY(4), FRIDAY(5), SATURDAY(6),
    SUNDAY(7);
    fun getDuration(day: Day): Int{
        return value - day.value;
    }
}
 
fun main(args: Array<String>) {
 
    val day1: Day = Day.FRIDAY
    val day2: Day = Day.MONDAY
    println(day1.getDuration(day2))        // 4
}

В даному випадку в перерахуванні визначена функція getDuration() , яка обчислює різницю в днях між двома днями тижня.


Вбудовані властивості і допоміжні методи

Всі перерахування володіють двома вбудованими властивостями:

  • name : повертає назву константи у вигляді рядка

  • ordinal : повертає назву порядковий номер константи

enum class Day(val value: Int){
    MONDAY(1), TUESDAY(2), WEDNESDAY(3),
    THURSDAY(4), FRIDAY(5), SATURDAY(6),
    SUNDAY(7)
}
 
fun main(args: Array<String>) {
 
    val day1: Day = Day.FRIDAY
    println(day1.name)        // FRIDAY
    println(day1.ordinal)     // 4
}

Крім того, в Kotlin наам доступні допоміжні функції:

  • valueOf(value: String) : Повертає об'єкт перерахування за назвою константи

  • values() : Повертає масив констант поточного перерахування

fun main(args: Array<String>) {
 
    for(day in Day.values())
        println(day)
 
    println(Day.valueOf("FRIDAY"))
}

Анонімні класи і реалізація інтерфейсів

Класи перерахувань можуть застосовувати інтерфейси. Для цього для кожної константи визначається анонімний клас, який містять всі реалізовані властивості і функції:

interface Printable{
    fun printName()
}
enum class DayTime: Printable{
    DAY{
        override fun printName(){
            println("День")
        }
    },
    NIGHT{
        override fun printName(){
            println("Ночь")
        }
    }
}
 
fun main(args: Array<String>) {
 
    DayTime.DAY.printName()     // День
    DayTime.NIGHT.printName()   // Ночь
}

Наш партнер:
beta test mp3 playlist downloader