Найти тему

Дата-классы в котлине.

Вопрос, кстати, довольно популярный. Среди джуниоров точно, но и повыше уровнем встречается. Давайте попробуем ответить.

Довольно часто бывает, что мы создаем классы, которые предназначены только для хранения данных. Например, создаем класс Cat с именем Барсик и возрастом 2. И больше там ничего не происходит. В котлин такие классы называются дата-классами: data class Cat(val name: String, val age: Int)

Требования для дата-классов:

  • Тут мы не можем создать класс с пустым конструктором. Должен быть хотя бы один параметр;
  • Параметры должны быть val или var. Никаких const или вообще без ничего;
  • Классы не могут быть абстрактными, open, sealed или inner;

А вот теперь самое интересное, почему все любят дата-классы. Компилятор автоматически создаст кучу методов на основе параметров из основного конструктора. Например, для data class Cat(val name: String, val age: Int):

  • equals() и hashCode(). Тут важно, что если мы явно прописали реализацию, то ничего не будет автоматически генерироваться и будет использоваться существующая.
  • toString() в виде "Cat(name=Barsik, age=2)". Тут аналогично генерация аналогична первому пункту.
  • component1(), который отвечает за name и вернет Barsik и component2(), который отвечает за age и вернет 2. Явно НЕ реализуется.
  • функция copy(). Явно НЕ реализуется. Через copy() можем менять некоторые параметры, оставляя другие неизменными. Например: barsik.copy(name = "Mursik"). Делаем Мурзика из Барсика :)

Дата-классы могут наследоваться от других классов и расширять их.

Если мы не хотим, чтобы какое-то поле из конструктора использовалось при генерации методов, то это поле надо вынести в тело класса:

data class Cat(val name: String) { val age: Int = 2 }

Но тут важный момент. В equals тогда будет использоваться только имя, так что если мы сравним двух котиков с одним именем и разным возрастом, то котики будут считаться равными.

А теперь немного технической и никому не нужной информации, которую точно не ждут от джуниоров (да и вообще не ждут при ответе, но я обязательно попробую рассказать про это): на Хабре где-то была классная статья про дата-классы от Баду. И вот там говорилось, что в среднем один дата-класс обходится в 120 байт в сжатом виде и в 400 байт в обычном. 400 байт — это как 400 буковок. Выглядит не так уж и много, но если убрать все дата-классы, то размер уменьшался аж на 4%.

Дубль статей в телеграмме — https://t.me/android_junior

Мой твиттер в телеграмме — https://t.me/android_junior_notes