Разкажи за 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 методи (само чрез интерфейси или абстрактни класове). Затворените класове по подразбиране са абстрактни, а техните конструктори са частни.