Вопрос, кстати, довольно популярный. Среди джуниоров точно, но и повыше уровнем встречается. Давайте попробуем ответить.
Довольно часто бывает, что мы создаем классы, которые предназначены только для хранения данных. Например, создаем класс 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