Sobes.tech
Middle

Разкажи за data класовете и sealed класовете в Kotlin.

sobes.tech AI

Отговор от AI

Класовете данни в Kotlin се използват за съхранение на данни. Те автоматично генерират полезни методи като equals(), hashCode(), toString(), copy(), както и компоненти за деструктуриране.

// Пример за клас данни
data class User(val name: String, val age: Int)

Затворените класове се използват за представяне на ограничена йерархия на класове. Всички подкласове трябва да бъдат дефинирани в същия файл като затворения клас (в Kotlin 1.5+ това ограничение е облекчено). Това позволява на компилатора да гарантира пълнота при прегледа на подкласовете, например в израза when.

// Пример за затворен клас
sealed class Result {
    data class Success(val data: String) : Result()
    data class Error(val message: String) : Result()
    object Loading : Result()
}

// Пример за използване на затворен клас в израз `when`
fun processResult(result: Result) {
    when (result) {
        is Result.Success -> println("Успех: ${result.data}")
        is Result.Error -> println("Грешка: ${result.message}")
        Result.Loading -> println("Зареждане...")
    }
}

Основни разлики:

  • Цел: класове данни - съхранение на данни, затворени класове - ограничаване на йерархията на класовете.
  • Генерирани методи: класовете данни генерират стандартни методи за данните, затворените - не.
  • Ограничение на подкласовете: затворените класове налагат ограничения върху обявяването на подкласове, класовете данни - не.
  • Пълнота в when: компилаторът Kotlin може да провери пълнотата на подкласовете на затворен клас в when без else клауза.

И двете, затворените и класовете данни, могат да бъдат абстрактни, но класовете данни не могат да бъдат open (тъй като са final по подразбиране) и не могат да реализират директно open методи (само чрез интерфейси или абстрактни класове). Затворените класове по подразбиране са абстрактни, а техните конструктори са частни.