Ответ
Data class — это специальный класс в Kotlin, предназначенный для хранения данных. Он автоматически генерирует полезные методы: equals(), hashCode(), toString(), copy() и componentN() функции (для деструктуризации).
Основные особенности:
- Объявляется с ключевым словом
data - Параметры в первичном конструкторе автоматически становятся свойствами
- Не может быть
abstract,open,sealedилиinner
Пример:
data class User(val name: String, val age: Int)
Автоматически генерируется:
val user1 = User("Alex", 25)
val user2 = user1.copy(age = 26) // копия с изменённым age
val (name, age) = user1 // деструктуризация
Используется для DTO, моделей данных и других случаев, когда важна структурная эквивалентность.
Ответ 18+ 🔞
А, ну вот, смотри, опять про эти ваши data class'ы заговорили. Ну ладно, раз уж начали, давай разберем, что это за зверь такой, а то народ путается, как будто впервые слышит.
Короче, представь себе, что тебе нужно просто хранить какие-то данные. Имя, возраст, почту — хуй с горы, что угодно. Обычный класс для этого — это как ехать на велосипеде за хлебом в соседний город: овердохуища кода писать, equals, hashCode, toString... Ёпта, терпения ноль ебать!
Так вот, data class — это как раз твой спаситель. Объявляешь его с волшебным словом data, и он тебе сам, автоматом, как по маслу, генерирует все эти полезные штуки. Не надо руками это всё выписывать, как будто на дворе 2002-й год.
Основные фишки, которые надо запомнить, чтобы не выглядеть как манда с ушами:
- Ключевое слово
data— без него нихуя не работает, просто обычный класс получится. - Параметры в основном конструкторе — они сразу становятся свойствами. Не надо объявлять
valилиvarв теле класса, всё делается на месте. - Он не может быть каким-то особенным — ни
abstract, ниopen, ниsealed, ниinner. Просто скромный хранитель данных, и всё.
Вот смотри, как это выглядит, чтоб совсем понятно было:
data class User(val name: String, val age: Int)
Вот и весь класс. А теперь смотри, что он умеет из коробки, сам, без твоей помощи:
equals()иhashCode(): Сравнивает объекты по их содержимому (по всем этимval nameиval age), а не по тому, что это одна и та же ссылка в памяти. То есть два разных объектаUser("Alex", 25)будут считаться равными. Удобно, правда?toString(): Красивенько выводит все свойства. НеUser@ab1234, а что-то вродеUser(name=Alex, age=25).copy(): Вот это вообще магия. Допустим, у тебя есть объект, и тебе нужен такой же, но с одним изменённым полем. Вместо того чтобы создавать новый и копировать всё вручную, ты просто делаешьcopy. Смотри:
val user1 = User("Alex", 25)
val user2 = user1.copy(age = 26) // Всё то же самое, только возраст 26. Красота!
componentN()функции: Это для деструктуризации. Звучит страшно, а на деле — просто разобрать объект на запчасти.
val (name, age) = user1 // Теперь в `name` будет "Alex", а в `age` — 25.
Где это всё применять? Да где угодно! Модели ответа от сервера (эти твои DTO), параметры для навигации, состояние экрана — везде, где важны сами данные и их равенство между собой, а не какая-то хитрая логика.
В общем, data class — это пиздец как удобно. Не изобретай велосипед, используй.