В чем разница между class и data class

Ответ

Основное отличие data class от обычного class в Kotlin - автоматическая генерация полезных методов для работы с данными:

  1. Автоматические методы: data class генерирует equals(), hashCode(), toString(), copy() и componentN() функции
  2. Деструктуризация: data class поддерживает деструктуризацию на свойства
  3. Основное назначение: 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 твой выбор, ядрёна вошь!