Что такое Data Class

Ответ

Data class — это специальный класс в Kotlin, предназначенный для хранения данных. Он автоматически генерирует полезные методы: equals(), hashCode(), toString(), copy() и componentN() функции (для деструктуризации).

Основные особенности:

  1. Объявляется с ключевым словом data
  2. Параметры в первичном конструкторе автоматически становятся свойствами
  3. Не может быть 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-й год.

Основные фишки, которые надо запомнить, чтобы не выглядеть как манда с ушами:

  1. Ключевое слово data — без него нихуя не работает, просто обычный класс получится.
  2. Параметры в основном конструкторе — они сразу становятся свойствами. Не надо объявлять val или var в теле класса, всё делается на месте.
  3. Он не может быть каким-то особенным — ни 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 — это пиздец как удобно. Не изобретай велосипед, используй.