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 ООП Data-класи


Іноді класи бувають необхідні тільки для зберігання деяких даних. У Kotlin такі класи називаються data-класи. Вони визначаються з модифікатором data :

data class Person(val name: String, val age: Int)

При компіляції такого класу компілятор автоматично додає в клас функції:

  • equals (): порівнює два об'єкти на рівність

  • hashCode (): повертає хеш-код об'єкта

  • toString (): повертає строкове представлення об'єкту

  • copy (): копіює дані об'єкта в інший об'єкт

Причому при виконанні дій ці функції враховують всі властивості, які визначені в первинному конструкторі. Наприклад, візьмемо функцію toString() , яка повертає строкове представлення об'єкту:

fun main(args: Array<String>) {
 
    val alice: Person = Person("Alice", 24)
    println(alice.toString())
}
 
class Person(val name: String, val age: Int)

Результатом програми буде наступний висновок:

data class Person(val name: String, val age: Int)

І результат буде відрізнятися:

data class Person(val name: String, val age: Int){
    override fun toString(): String {
        return "Name: $name  Age: $age"
    }
}

В цьому випадку для функції toString компілятор не визначатиме реалізацію.

Іншим показовим прикладом є копіювання даних:

fun main(args: Array<String>) {
 
    val alice: Person = Person("Alice", 24)
    val kate = alice.copy(name = "Kate")
    println(alice.toString())   // Person(name=Alice, age=24)
    println(kate.toString())    // Person(name=Kate, age=24)
}
 
data class Person(var name: String, var age: Int)

Знову ж компілятор генерує функцію копіювання за замовчуванням, яку ми можемо використовувати. Якщо ми хочемо, щоб деякі дані у об'кта відрізнялися, то ми їх можемо вказати в функції copy у вигляді іменованих арументов, як у випадку з властивістю name в прикладі вище.

При цьому щоб клас визначити як data-клас, він повинен відповідати ряду умов:

  • Первинний конструктор повинен мати як мінімум один параметр

  • Всі параметри первинного конструктора повинні передувати ключовими словами val або var , тобто визначати властивості

    Властивості, які визначаються поза первинного конструктора, не використовуються у функціях equals і hashCode

  • Клас не повинен визначатися з модифікаторами data , abstract , sealed або inner .

Також варто відзначити, що незважаючи на те, що ми можемо визначати властивості в первинному конструкторі і через val, і через var, наприклад:

data class Person(var name: String, var age: Int)

Але взагалі в ряді ситуацій рекомендується визначати властивості через val, тобто робити їх незмінними, оскільки на їх підставі обчислює хеш-код, який використовується в якості ключа об'єкта в такий колекції як HashMap.


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