Недавно я попал в буткемп на 6 месяцев, чтобы продолжить свою карьеру, став инженером-программистом (разработка мобильных приложений), если быть точным. Я решил написать короткую статью о том, что такое data class и normal class в Kotlin и о некоторых отличиях.

Что такое класс?

Класс — это план объекта; он разделяет общие свойства и поведение в форме членов и функций-членов.

В Kotlin класс объявляется с ключевым словом class. Объявление класса состоит из имени класса, заголовка класса (с указанием параметров его типа, основного конструктора и т. д.).

Итак, технически объект является экземпляром класса.

class Person {

    val name: String = "Dubem"
    val age: Int = 22
    fun info() = "This is $name and my age is $age"
}

fun main() {

    val person = Person()
    println(person)
    println(person.name)
    println(person.age)

}

В этом примере мы объявляем класс Person, а затем создаем из него объект.

Что такое класс данных?

Класс данных — это простой класс, который используется для хранения данных/состояния и содержит стандартную функциональность. Ключевое слово data используется для объявления класса как класса данных. С помощью классов данных мы можем значительно сократить стандартный код. Компилятор автоматически создает функции equals, hashCode, toString и copy.

data class User(val name: String, val email: String)

fun main() {

    val u1 = User("Dubem Ezeagwu", "[email protected]")
    println(u1)

    println(u1.name)
    println(u1.email)

    val (name, email) = u1
    println("$name $email")

    val u2 = User("Dubem Ezeagwu", "[email protected]")

    println(u1 == u2)  // Structural equality
    println(u1 === u2)  // Referential equality
}

Различия между классами данных и обычными классами.

  1. Класс данных должен быть объявлен как минимум с одним первичным параметром конструктора, который должен быть объявлен с помощью val или var. Обычный класс может быть определен как с параметром, так и без него в его конструкторе.
  2. Классы данных имеют реализации по умолчанию для следующих методов, использующих только свойства, объявленные в основном конструкторе; toString(), hashCode(), copy(), componentN(), equals(). Реализация этих методов может быть написана в обычных классах с использованием свойств, которые были объявлены или не были объявлены в основном конструкторе.
  3. Класс данных не может быть расширен другим классом. По умолчанию они являются конечными классами. Обычные классы могут быть расширены другими классами, включая классы данных. Однако должны быть соблюдены определенные условия.
  4. Классы данных не могут быть закрытыми, открытыми, абстрактными или внутренними. Обычные классы могут быть любыми из них.

Итак, у вас есть это! Краткий обзор того, что такое классы и классы данных, и чем они оба отличаются по-своему. Я надеюсь, что смог объяснить эти понятия, и у вас есть базовое понимание. Ваше здоровье!