Ответ
Основное отличие data class от обычного class в Kotlin - автоматическая генерация полезных методов для работы с данными:
- Автоматические методы: data class генерирует
equals(),hashCode(),toString(),copy()иcomponentN()функции - Деструктуризация: data class поддерживает деструктуризацию на свойства
- Основное назначение: data class предназначен для хранения данных, обычный class - для логики
Пример:
data class User(val name: String, val age: Int)
// Автоматически получаем:
// toString(): User(name=John, age=30)
// copy(), equals(), hashCode()
class Service {
fun process() { /* логика */ }
}
Ограничения data class:
- Должен иметь хотя бы один параметр в конструкторе
- Параметры должны быть
valилиvar - Не может быть
open,abstract,sealedилиinner
Ответ 18+ 🔞
А, ну это же проще пареной репы, если честно. Смотри, есть у нас в Котлине обычный класс — ну, как дед в гараже, который вечно что-то паяет, логику свою пишет, методы там всякие. А есть data class — это как его внучок-ботаник, который всё по полочкам разложил: имя, возраст, почта. И за него компилятор кучу полезной хуйни сам напишет, чтобы тебе не париться.
Короче, data class — это такая хитрая жопа. Ты ему скажешь: «Вот тебе свойства, валяй», а он тебе в ответ сразу пять штук готовых методов генерирует: equals(), hashCode(), toString(), copy() и ещё componentN() для деструктуризации. Ёпта, красота же!
Вот смотри, как это выглядит:
data class User(val name: String, val age: Int)
// Автоматически получаем:
// toString(): User(name=John, age=30)
// copy(), equals(), hashCode()
class Service {
fun process() { /* логика */ }
}
Видишь разницу? User — это просто мешок с данными, toString() сам напишет красивый. А Service — это уже работяга, который должен шевелить извилинами и что-то делать.
И ещё фишка — деструктуризация. С data class'ом можно так:
val (userName, userAge) = User("Вася", 25)
// И всё, userName = "Вася", userAge = 25, как по маслу!
Но и подводные камни есть, куда ж без них. Этот data class — парень с характером. Во-первых, у него в главном конструкторе должен быть хотя бы один параметр, иначе он обидится. Во-вторых, все эти параметры должны быть val или var — просто так, голыми, их не засунешь. И в-третьих, он не может быть open, abstract, sealed или inner. Не царское это дело — наследоваться или абстрактничать, когда ты просто хранитель данных.
Так что выбирай: хочешь логику и мощь — бери обычный class. А если надо просто аккуратно данные перекладывать, чтобы equals сам работал и копию одним движением сделать — тогда data class твой выбор, ядрёна вошь!