Kotlin Data Class — що таке POJO, чому Java сакс, та чому важлива к-сть строк кода
Всім привіт, хотів би почати цю статтю з маленького анонса:
В мене нещодавно змінився трохи графік і через це з’явилось трохи часу на менторство, тому якщо раптом ви шукали або шукаєте ментора, то в мене є можливість ним стати. Всі деталі можна буде обсудити віч на віч, наприклад, в інстаграмі. Тому пишіть, кому актуально ;)
insta: @kkkhyzhun
Про Data Class-и
кщо коротко, то data class-и — то любов. А зараз я спробую пояснити чому.
Досить часто в програмування (завжди) приходиться працювати з даними, і як правило цих даних досить багато і вони всюди.
Наприклад, якщо у вас є умовна “машина”, то в неї мабуть є якісь параметри аля brand, model, color, price і так далі.
Таких змінних може бути досить багато, не 2–3, а там наприклад 80 або 100.
Окрім умовної машини у вас може бути досить багато інформації і про інше, наприклад ви розробляєте всіма улюблений Monobank.
Не важливо backend ви робите чи frontend, чи щось інше, плюс-мінус суть буде однакова.
У вас буде щось по-типу Транзакції, а там в свою чергу будуть дані про:
— хто відправив
— кому
— в якій годині
— яку суму
— чи була комісія
— чи була ця транзакція успішна
і так далі…
Окрім “Транзакції” у вас буде і “Користувач”, і “Налаштування”, і “Аккаунт”, і “Ачівки” і так далі.
— це все дані, дані які потрібно день зберігати…
Де і як зберігати дані?
Всі ці дані зберігати аби де, аби як — не варіант. Як правило вони групуються за логічними ознаками, наприклад, все, що відноситься до “автомобіля” — знаходиться в одному місці, все, що відноситься до “користувача” — в другому.
Базово це хороший варіант, в якійсь мірі воно так і працює. Але щоб воно не було як голки в полі — для цього потрібно позначити якісь певні рамки, в нашому варіанті це і буде групування схожих за змістом змінних в одному місці, а саме в класах.
Це особливо зрозуміло, коли у вас є, наприклад, “відправник” і “отримувач”.
І там, і там є firstName, і там, і там є lastName — і таких змінних може бути багато.
писати senderFirstName, recipientFirstName, а потім повторяти це все для всіх інших змінних — просто не варіант, по-перше їх може бути “ого-го-го” як багато, по-друге а для чого, якщо можна просто створити відповідні класи і всередині них використовувати все, що треба? ;)
Що таке POJO?
POJO — це Plain Old Java Object. Це просто клас, в якому зберігаються дані.
Як ви пам’ятаєте — Kotlin досить тісно дружить з Java, хоть ці відносини і добровільно-примусові, але всеодно підтримувати все старе потрібно, тому що дуже багато речей написано на Java.
Якщо раптом ви не знали, то у Kotlin є інтерполяція з Java — простою мовою це значить, що ви можете всередині Java проекта просто взяти і спонтанно писати на Kotlin і все буде працювати добре, без нюансів, без але.
Тому, якщо раптом у вас проект на Java, то ви завжди можете невеликими кроками пробувати переходити на Kotlin.
Але зараз я би хотів продемонструвати вам крутість Kotlin-а і показати різницю між “старою” і “новою” мовою програмування.
Давайте представимо, що в нас є задача написати клас Car і описати 10 полів. Як ми це зробимо на Java?
- Ми створимо клас Car
- Далі ми створюємо змінні, які будуть описувати цю модель
- Далі нам потрібно створити конструктор і переопреділити їх
- Далі, (я вже втомився…) треба додати всі getter-и і setter-и
- Далі, опціонально, можна додати методи toString, equals і hasCode() — які будуть робити свою базову роботу.
В результаті у нас вийшов ось такий клас розміром у 134 строчок кода.
Хто знає, що він робить? Ось цей клас
3…2…1…
— НІЧОГО!
Цей клас нічого не робить, це просто DATA HOLDER, все що робить, це зберігає значення всередині змінної — все! 134 строчки кода, Карл.
В чому магія слова Data в Kotlin?
А тепер давайте подивимось як буде виглядати аналогічний клас, але в Kotlin.
Для цього ми можемо або створити його з нуля, або конвернути “Джавовський” в Kotlin за допомогою ключових клавіш Cmd+Control+Shift+K — якось так, або просто через допоміжну панель зверху.
Ось таким вот легким рухом руки ми робимо ту саму роботу, але на Kotlin.
І це всього лише 12 строчок кода.
Вот-так-вот, шах і мат джавісти.
Але по правді кажучи це навіть ще не все, що ключове слово data нам дає.
Окрім того, що ключове слово data надає нам getters і setters для всіх змінних, воно ще реалізує за замовчуванням:
- equals()/hashCode() pair
- toString() of the form “User(name=John, age=42)”
- componentN() functions corresponding to the properties in their order of declaration.
- copy() function
Чому кількість строчок кода важлива?
и як програмісти більшість часу будете читати код, а ніж писати його. Просто тому, що робота у нас така 7 раз подумати, 1 раз написати. І ці “7 раз” — це кожного разу читати код, а що гірше — досить часто це читати чужий код.
Саме тому, досить важливим є те, що ви робите набагато більше роботи пишучи набагато менше кода. Завдяки такій філософії ви будете:
- менше читаєте — більше думаєте.
- менше витрачати час на дурну роботу, яка може бути автоматизована
- отримуєте більший і кращий результат, прикладаючи менше зусиль
- менше будуть втомлюватись очі
Хтось (а можливо джавісти) можуть сказати, що це “за вуха” затягнуті плюси, але мені відверто плювати, це мій влог, я виражаю свою думку, яка на хвилинку базується на багаторічному досвіді і співпадає з думкою ком’юніті.
Тому в принципі пофіг, до багатьох джавістів можна застосувати фразу, коли “стару собаку неможливо навчити нових трюків”. А тут вам “відітєлі” стильний, модний, молодіжний Kotlin пропонують
Давайте далі.
Про вимоги в data class-ах
Коротко і ясно:
- The primary constructor needs to have at least one parameter.
- All primary constructor parameters need to be marked as val or var.
- Data classes cannot be abstract, open, sealed, or inner.
Всім дякую за увагу. До нових зустрічей.
🎬 Ось мій канал, де будуть всі відео на різні теми в програмуванні:
📚 Ось мій Patreon, де будуть всі матеріали в текстовому форматі, додаткова інфа, розбір приклдів, домашні завдання, ІТ-словник, і тд:
Окрім цього, там є різні пропозиції, наприклад, можемо займатись 1х1, можу допомогти зробити резюме, проведу співбесіду і так далі.
🎬 Весь контент, який я роблю — це все мій особистий досвід.
Я пишу/знімаю все сам і ділюсь з вами корисною інформацією, яку ніхто не розповідає, тому підтримайте підпискою ❤️
🙂 На цьому у мене — все!
👉🏻 Ставте лексуси, підписуйтесь і будьте умнічками.
Якщо я правий — похваліть, якщо ні — посваріть.
Но в любому випадку не забудьте дати фідбек 😉
Успіхів! 🇺🇦🦄