Чому Kotlin може бути чудовим вибором для вашого проєкту

Усі статті, обговорення, новини про Mobile — в одному місці. Підписуйтеся на телеграм-канал!

Привіт усім! Мене звати Максим Дудка, я працюю Java Engineer у компанії EPAM Systems на рітейл-проєкті. У цій статті йдеться про те, чому ми мігрували на Kotlin (спойлер: підвищена безпека, зменшення обсягу коду та покращена читабельність). Сьогодні я хочу поділитися з вами причинами, чому Kotlin може бути чудовим вибором для вашого майбутнього проєкту. У світі мов програмування Kotlin виокремлюється як потужна, стисла та виразна мова, яка швидко стає мовою вибору для багатьох розробників. Якщо ви ще не спробували її, ось декілька моїх улюблених функцій, які виділяють Kotlin, і чому варто розглянути можливість переходу на цю мову. Статтю також можна прочитати англійською.

Сумісність з Java

Однією з найважливіших переваг Kotlin є безшовна сумісність з Java. Ви можете мати код Java та Kotlin, які співіснують у тому ж проєкті, і все буде компілюватися ідеально. Ця функція полегшує розробникам поступовий перехід з одної мови на іншу.

Null-Safety

Kotlin прагне ліквідувати винятки null pointer, роблячи всі типи не нульовими за замовчуванням. Ви повинні чітко вказати, чи може змінна бути null, додаючи ? до її типу.


var name: String? = null // Може бути null 
var age: Int = null // Помилка компіляції

Ця функція допомагає запобігти винятку null pointer на етапі компіляції, підвищуючи надійність вашого коду.

Експресивний синтаксис

Синтаксис Kotlin дозволяє виразити більше ідей за менший обсяг коду. Це не тільки зменшує кількість коду, який потрібно написати, але й робить його більш читабельним і легким для розуміння. Розглянемо приклад роботи з можливими нульовими значеннями:

Java:


String name = getName();
if (name != null) {
    System.out.println(name.length());
} else {
    System.out.println("Name is null");
}

Kotlin:


val name = getName()
println(name?.length ?: "Name is null")

У цьому прикладі Kotlin дозволяє використовувати безпечний виклик (?.) та елвіс-оператор (?:) для обробки можливих нульових значень без необхідності явної перевірки на null, як це робиться в Java.

Розумні приведення типів

Функція розумного приведення типів Kotlin автоматично обробляє приведення типів, зменшуючи кількість шаблонного коду та роблячи його чистішим та зрозумілішим.

if (obj is String) {
    // тут obj автоматично приводиться до String
    print(obj.length)
}

Стислі дата-класи

Одна зі сфер, де Kotlin виблискує, — це визначення класів даних. Порівняймо, як ви б визначили простий DTO Person у Java, Java з Lombok та Kotlin.

Java:

У Java доведеться написати шаблонний код для гетерів, сетерів, hashCode(), equals(), та toString().


public class Person {
    private String name;
    private int age;    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }    
    public String getName() {
        return name;
    }    
    public void setName(String name) {
        this.name = name;
    }    
    public int getAge() {
        return age;
    }    
    public void setAge(int age) {
        this.age = age;
    }    
    @Override
    public boolean equals(Object o) {
        // ... реалізація
    }    
    @Override
    public int hashCode() {
        // ... реалізація
    }    
    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}

Java з Lombok:

Використовуючи Lombok, ви можете зменшити кількість шаблонного коду, анотувавши клас @Data.

import lombok.Data;

@Data
public class Person {
    private String name;
    private int age;
}

Lombok автоматично згенерує гетери, сетери, hashCode(), equals(), та toString().

Kotlin:

У Kotlin можна досягти того ж самого одним рядком коду.


data class Person(val name: String, val age: Int)
data class Kotlin автоматично надає hashCode(), equals(), toString(), copy(), та componentN(), а також гетери та сетери для змінних властивостей.
P.S: З Java 17 можна використовувати records, що мають дуже схожий функціонал.

Корутини

Kotlin вводить концепцію корутин для обробки конкуренції. Корутини легші, ніж потоки, і можуть ефективно обробляти велику кількість одночасних завдань.


fun launchTasksWithCoroutines() = runBlocking {
    val jobs = List(100_000) {
        launch {
            // Ваша паралельна задача
        }
    }
    jobs.forEach { it.join() }
}

Цей приклад демонструє запуск 100 000 одночасних завдань за допомогою корутин без проблем з пам’яттю.

Функції розширення

Kotlin дозволяє додавати нову функціональність до класів, що існують, без їхньої зміни за допомогою функцій розширення.


fun String.addExclamation(): String = this + "!"
val excited = "Hello".addExclamation()  // Повертає "Hello!"

Перевантаження операторів

Kotlin пропонує зручність перевантаження операторів, дозволяючи розробникам надавати власні реалізації для операцій базових типів. Ця функція покращує читабельність і виразність коду. У Kotlin ви можете визначити або перевантажити оператори, як-от +, -, *, / та інші для власних типів, що призводить до більш інтуїтивного та чистого коду.


data class Complex(val real: Double, val imaginary: Double) {
    operator fun plus(c: Complex) = Complex(real + c.real, imaginary + c.imaginary)
}
val c1 = Complex(3.0, 4.0)
val c2 = Complex(2.0, 7.5)
val sum = c1 + c2  // Використовує власний оператор `plus`

Підтримка DSL

Kotlin характерний відмінною підтримкою для створення власних DSL (Domain-Specific Languages), що дозволяє створювати читабельний код для конкретних доменів або інженерних задач.

Приклад з HTML:


html {
    head {
        title {+"HTML DSL Example"}
    }
    body {
        h1 {+"Hello, World!"}
        p {+"This is an example of a DSL in Kotlin."}
    }
}

Цей код використовує DSL для побудови HTML-документа. Кожен тег HTML представлений як функція в Kotlin, що приймає лямбда-вираз як аргумент. Лямбда-вирази використовуються для вкладення тегів, що створює чистий та структурований синтаксис для побудови HTML.

Приклад з маршрутизацією:


router {
    path("/users") {
        get { /* обробка GET-запиту */ }
        post { /* обробка POST-запиту */ }
    }
    path("/products") {
        get { /* обробка GET-запиту */ }
    }
}

У цьому разі router, path, get і post є функціями, які визначають DSL для конфігурації маршрутизації вебзастосунку.

Легкість навчання

Kotlin розроблено як більш інтуїтивну та доступну мову програмування, ніж більшість інших. Синтаксис Kotlin спроєктовано так, аби він був простим для читання та написання, що полегшує навчання та розуміння мови (навіть для новачків). Відтак команди розробників можуть швидко адаптуватися та стати продуктивними з Kotlin, знижуючи час і зусилля на навчання.

Спільнота, підтримка та інструменти

Kotlin має активну спільноту розробників, яка збільшується і надає сильну підтримку та ресурси для навчання. Є багато чудових бібліотек, фреймворків та інструментів, що доступні для розробки на Kotlin (зокрема можна використовувати будь-які бібліотеки, що написані для Java). Це не тільки полегшує розробку, але й забезпечує доступ до найновіших технологій і найкращих практик для розробки програмного забезпечення.

Великою перевагою Kotlin є його відмінна підтримка в IntelliJ IDEA, що є одним з найпопулярніших інструментів розробки для Java та інших мов.

Kotlin також активно підтримується компанією JetBrains та іншими великими організаціями, що гарантує його стабільність та надійність у майбутньому.


Kotlin — не просто інша мова програмування; це сучасна, виразна та потужна мова, яка долає багато обмежень Java. Виділені вище функції — лише кілька моїх улюблених аспектів Kotlin, хоча це — лише вершина айсберга.

👍ПодобаєтьсяСподобалось14
До обраногоВ обраному1
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Невеличкий комент — перевантаження + для dsl вже давно антипатерн — його легко загубити і помилки не буде, але то буде noop, часто дуже складно розуміти в якому контексті цей + працює , тому в Compose це прибрали і замінили на обробку анотацій, де доволі чітко розумієш, коли додається блок у дерево Compose. Тому як мінімум краще + замінити на text("some text«) або ж text(content: () -> String) що буде як text { «some text» }

Мені подобається Котлін саме тим, що треба менше писати коду в порівнянні з Джава. Якось швидше пишеться і легше читається.
А з недоліків я бачу лише один — кацапське походження. Запашок ще не скоро зникне

Місяць тому була аналогічна стаття. Навіщо постити дублікати?

dou.ua/forums/topic/45180

Може тут 6 причин😂

Kotlin крутий!
Але і не без мінусів (суб’єктивно):
— Для open-source бібліотеки краще обрати Java так як Kotlin за собою притащить залежність в рантайм та постійно треба думати як код буде виглядати з Java.
— Щоб писати хороший код — потрібно знати і Kotlin і Java — бо Kotlin, по факту, цукор поверх Java, а не самостійна мова
— Немає package-private visibility
— Працювати з корутинами на бекенді не дуже зручно бо, як правило, на вході і виході у тебе буде база данних і веб сервер без нативної підтримки корутин... Їх треба буде в щось завернути... І я ще не зустрічав людину яка могла б детально пояснити як воно все в купі буде працювати на рівні потоків. А потім дивишся на код який завантажує здоровенні коллекції в пам’ять обернуті в `runBlocking` 🤓

Щоб писати хороший код — потрібно знати і Kotlin і Java — бо Kotlin, по факту, цукор поверх Java, а не самостійна мова

Ви плутаєте з Groovy, Котлін — саме самостійна мова з власною стандартною бібліотекою і офіційними компіляторами в JavaScript і нейтів код.

— Немає package-private visibility

І слава богу, нафіга цей антипатерн треба?

Працювати з корутинами на бекенді не дуже зручно бо, як правило, на вході і виході у тебе буде база данних і веб сервер без нативної підтримки корутин... Їх треба буде в щось завернути... І я ще не зустрічав людину яка могла б детально пояснити як воно все в купі буде працювати на рівні потоків. А потім дивишся на код який завантажує здоровенні коллекції в пам’ять обернуті в `runBlocking`

Якщо виникають такі питання, то варто заглянути в сорскод бібліотеки kotlinx.coroutines самому (реалізація для JVM). Там все достатньо просто. Завертання в `runBlocking` таких речей це ж не проблема Котліна чи корутин, а неправильне використання іструмента.

Kotlin крутий!
Але і не без мінусів (суб’єктивно):
— Для open-source бібліотеки краще обрати Java так як Kotlin за собою притащить залежність в рантайм та постійно треба думати як код буде виглядати з Java.
— Щоб писати хороший код — потрібно знати і Kotlin і Java — бо Kotlin, по факту, цукор поверх Java, а не самостійна мова
— Немає package-private visibility
— Працювати з корутинами на бекенді не дуже зручно бо, як правило, на вході і виході у тебе буде база данних і веб сервер без нативної підтримки корутин... Їх треба буде в щось завернути... І я ще не зустрічав людину яка могла б детально пояснити як воно все в купі буде працювати на рівні потоків. А потім дивишся на код який завантажує здоровенні коллекції в пам’ять обернуті в `runBlocking` 🤓

Я один це помітив, чи побільшало розмов про Java? Цікаво

То нічого що стаття про Котлін?😂

Для об’єктивності треба було б перелікувати й недоліки. Наприклад необхідність додаткової runtime бібліотеки, а також що окрім Ідеї інші IDE з котліном не працюють бо немає відкритого language server. З появою java 21 більшість переваг втрачають сенс.

Якщо в статті замінити ’Kotlin’ на ’Scala’, то майже нічого не зміниться

подумаешь, легкость изучения...

Зазвичай такі коментарі пишуть ті, хто жодного разу не пробував вивчити Скалу/Котлін

В Scala значно більше фіч. І тільки корутин нема.

У цій статті йдеться про те, чому ми мігрували на Kotlin (...., зменшення обсягу коду та покращена читабельність).

Нормально так впарили клієнту непотрібну роботу😁

Та може в них закінчилися таски, команду розпускати не хочуть, а гроші є — тоді чому б і ні

Угу, тому робочий софт вирішили переписати на іншу мову.

а як взагалі на андроїді зараз з kotlin, всі нові проекти вже пишуть на ньому чи все таки java переважає?

Вже давно only Kotlin якщо новий проект.
В 2023 на Java починати проект на андроід це самогубство.

интересно, приложение, написанное на котлине, пройдет секурити аудит/сертификацию?
Любое использование росийского инструмента это сразу минус 100 очков гриффиндору.

А любой софт, написанный с помощью IDEA, RubyMine, ReSharper, etc пройдет аудит? -)
Я уже молчу, что облом аудитора наступит в момент попытки доказать, что это «российский инструмент».

А любой софт, написанный с помощью IDEA, RubyMine, ReSharper, etc пройдет аудит? -)

Не уверен. Если ты в безопасный контур вносишь потенциально небезопасные инструменты — это значит что контур скомпрометирован.

Я уже молчу, что облом аудитора наступит в момент попытки доказать, что это «российский инструмент».

Аудитор не должен ничего доказывать. Ему достаточно предоставить qualified opinion — и у тебя проблемы.

Аудитор не должен ничего доказывать. Ему достаточно предоставить qualified opinion — и у тебя проблемы.

надо понимать, что «qualified opinion» будет абсолютно от балды, и kotlin тут вобще не причем

надо понимать, что «qualified opinion» будет абсолютно от балды, и kotlin тут вобще не причем

ну почему? russian-backed/russuian-controlled development tool/util/language — нужно что-то доказівать?

нужно что-то доказівать?

якщо доводити не треба то аудітором може працювати більшість бабок під під’їздами

в мене є такі знайомі, одна вважала що автобудка від горгаза біла її дому тому що вони прослуховують її телефон, а сьогодні вчергове знайшла якась зраду про ідентифікацію пенсіонерів і коли я намагався переконати її по телефону що немає причин для хвилювання накричала коли сказав в розмові слово «пенсія» бо по телефону це казати не можна, її ж прослуховують

в мене є такі знайомі,

Которіе работают в аудиторских фирмах и чьему мнению доверяют?

Учитывая, что в их клиентах числится NASA — думаю, таки нужно. Тем более, важно уточнить, что именно понимается под «russian-controlled», т.к.: собственно к рашистскому государству и правительству JetBrains никаким боком, свою позицию в поддержку Украины они публично озвучили.

т.к.: собственно к рашистскому государству и правительству JetBrains никаким боком

И вы готовы доказать это в суде? что бывшие (а может — и нынешние) граждане РФ, включая «российского миллиардера, чье состояние увеличилось, не смотря на войны» — «никаким боком к государству»?
Видимо, это первый в истории случай, когда найден росийский миллиардер — «незваисимый от государства».
Причем второй владелец (и тоже миллиардер) — прожиавет в питере. это явный признак независимости.

свою позицию в поддержку Украины они публично озвучили.

"
Ничего личного — просто бизнес. Им сказали обезопасить бизнес — они обезопасили. «мы за мир» и прочее. Такие заявления от росиян — не говорят ровным счетом ни о чем.

Так это за меня, по сути, уже сделали NASA- уж кому-кому, а им бы вряд ли правительство США разрешило пользоваться программными продуктами, представляющими риск в сфере безопасности...

Так это за меня, по сути, уже сделали NASA- уж кому-кому, а им бы вряд ли правительство США разрешило пользоваться программными продуктами, представляющими риск в сфере безопасности...

но вы — не наса, не так ли?
Поэтому совершенно не факт, что вам — будет можно.
Наса вон и людей на ракетах катает, потому что им — можно.

Суттєвий недолік це 1.5 вакансії. Одна з яких на відроїд.

Але й конкуренція нижче. Пробитись на одну з 10-20 Котлін вакансій простіше ніж на 100-200 Java вакансій. Та й конкурувати ви будете з людьми у яких рік-два досвіду котліну, а не 15-20 яких багато серед джава програмістів.

Плюс з високою вірогідністтю це буде стартап, що може для когось бути плюс, а для когось навпаки.

Щось трохи задовбав цей PR російської мови програмування, названої за островом біля санкт-петербургу, на українському ресурсі під час війни з росією. Я ще розумію IntelliJ, там альтернативи гівно, але тут є власне Java та Scala. Остання джава вже взяла майже все, що треба, від Kotlin. Хочете чудо функціональщини — ось вам Scala.

JetBrains — компанія з Чехії, в березні 2022 року засудили агресію росії, закрили офіси та забрали свої ліцензії від рф dou.ua/...​nds-operations-in-russia. З приводу інших альтернатив серед мов програмування я лише описав свій досвід, буду радий почитати Вашу статтю про інші мови

Ага, а назва цього острова — просто співпало так? :) uk.m.wikipedia.org/wiki/Котлін. І імена в засновників цієї компанії з Чехії такі прямо чеські, лол " Компанія була заснована в Празі в 2000 році як приватна, трьома російськими програмістами: Сергієм Дмитрієвим, Євгеном Бєляєвим і Валентином Кіпятковим." Вона така ж чеська, як Люксофт — швейцарська...

Все ж казати, що компанія Jetbrains _з_ Чехії це трохи лицемірство. Let’s call a spade a spade, це компанія з РФ, в ній працюють і будуть працювати росіяни і я навіть не думаю, що внутрішня мова спілкування не російська.

При цьому все інше правда.

Не точно висловився, компанія що зареєстрована в Чехії, дякую за виправлення

Так. Я читав, що через суд з Oracle.

Це в тому числі, але в цілому, основна причина, що джава на мобілочках не та ж сама що джава на бекенді, на рівні JVM. Ми на 8 джаві сиділи ще недавно, ща на 11 мігруємо. Котлін компілиться в байткод 7 джави, і для нових фіч не треба пиляти нову JVM, яка повинна нормально працювати на будь-якому калькуляторі. Тому в свій час гугл стратегічно почав пушити котлін, і закривати частину апдейтів на рівні SDK/бібліотек, а не мажорної версії операційної системи

А чего исключение делать для IntelliJ, считаю что нужно тоже порицать ее использование. Вы оплачивая подписку спонсируете создание русского языка програмирования. :(

Лично я пользуюсь бесплатной, так что ничего не оплачиваю. А вот альтернативы не нашел.

это же как использовать 1С потому что нет альтернативы, не находите ? :)

Ого, навіть і не здогадувався про такі можливості мови Kotlin. Дуже цікаво, чекаю продовження!!

Серйозно, через десяток років існування мови ви вперше дізнались, що там є фічі, які на сьогодні вже і так буквально в кожній мові?

Так він зареєструвався спеціально щоб цей комент залишити)))

там ниже Viktor Kuzma такой же)

До плюсів можна ще додати, що можна писати код у функціональному стилі, чого в джаві немає

Якщо усі переваги перераховувати, то тут знадобиться цілий цикл статей, тож я вибрав свої найулюбленіші фішки)

Якщо всі перевеги перерахувати, то можна й на С++ перейти Х0

До речі непогана ідея порівняти С++ з тою ж таки Java, може реалізую в майбутньому:)

До плюсів можна ще додати, що можна писати код у функціональному стилі, чого в джаві немає

Ну... який функціональний стиль, коли є змінні? То може й монади легко реалізувати?

... може й HKT є з коробки :)?

Kotlin, звісно гарний вибір, але це по суті синтаксичний цукор над Java — точніше одна з мов яка «раниться» на JVM. Автору плюс, за популяризацію мови але би гарно назвати її деякі недоліки :)

В статті цього нема, але Kotlin можна запускати поверх JS (для написання фронтенду, наприклад) та поверх LLVM для написання нативного коду, тож це історія не тільки про JVM. Ідею про недоліки почув, їх не так вже й багато, але може на статтю і вистачить:)

a от в парі VB.NET & C# хто кому синтаксичний цукор?

Підписатись на коментарі