Расскажи о data-классах и sealed-классах в Kotlin.
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Data классы в Kotlin используются для хранения данных. Они автоматически генерируют полезные методы equals(), hashCode(), toString(), copy(), а также компоненты для деструктуризации.
// Пример data класса
data class User(val name: String, val age: Int)
Sealed классы используются для представления ограниченной иерархии классов. Все подклассы должны быть определены в том же файле, что и сам sealed класс (в Kotlin 1.5+ это ограничение ослаблено). Это позволяет компилятору убедиться в исчерпывающем переборе подклассов, например, в выражении when.
// Пример sealed класса
sealed class Result {
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()
object Loading : Result()
}
// Пример использования sealed класса в выражении when
fun processResult(result: Result) {
when (result) {
is Result.Success -> println("Успех: ${result.data}")
is Result.Error -> println("Ошибка: ${result.message}")
Result.Loading -> println("Загрузка...")
}
}
Основные отличия:
- Назначение: data классы - хранение данных, sealed классы - ограничение иерархии классов.
- Генерируемые методы: data классы генерируют стандартные методы для данных, sealed классы - нет.
- Ограничение подклассов: sealed классы накладывают ограничения на объявление подклассов, data классы - нет.
whenисчерпывающий перебор: компилятор Kotlin может проверить исчерпывающий перебор подклассов sealed класса вwhenбез веткиelse.
И sealed, и data классы могут быть абстрактными, однако data классы не могут быть open (поскольку они final по умолчанию) и не могут реализовывать open методы напрямую (только через интерфейсы или абстрактные классы). Sealed классы по умолчанию абстрактны, а их конструкторы приватные.