Kotlin Data Class — що таке POJO, чому Java сакс, та чому важлива к-сть строк кода

Alexander Khyzhun
6 min readFeb 20, 2023

--

Всім привіт, хотів би почати цю статтю з маленького анонса:

В мене нещодавно змінився трохи графік і через це з’явилось трохи часу на менторство, тому якщо раптом ви шукали або шукаєте ментора, то в мене є можливість ним стати. Всі деталі можна буде обсудити віч на віч, наприклад, в інстаграмі. Тому пишіть, кому актуально ;)

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, можу допомогти зробити резюме, проведу співбесіду і так далі.

🎬 Весь контент, який я роблю — це все мій особистий досвід.
Я пишу/знімаю все сам і ділюсь з вами корисною інформацією, яку ніхто не розповідає, тому підтримайте підпискою ❤️

🙂 На цьому у мене — все!
👉🏻 Ставте лексуси, підписуйтесь і будьте умнічками.

Якщо я правий — похваліть, якщо ні — посваріть.
Но в любому випадку не забудьте дати фідбек 😉

Успіхів! 🇺🇦🦄

--

--

Alexander Khyzhun
Alexander Khyzhun

Written by Alexander Khyzhun

🧙🏻‍♂️ Software Wizard 🎬 Tech blogger 🎌 JDM 🎷 Lofi artist 🏊🏻‍♂️ Swimmer

No responses yet