Узнайте больше о языке программирования Котлин. Я расскажу, где применяется Kotlin и почему он оптимален для приложений на Android. Подробнее в блоге CREAZARD.

Приветствую! Меня зовут Громова Алена и я основатель компании мобильной разработки. Этот материал в своем блоге решила посвятить языку Kotlin, как одному из “ходовых” языков программирования, с которыми давно работает моя команда. Написано в соавторстве с нашим Android разработчиком Евгением.

Немного копнем в истоки. Само свое название язык получил в честь острова Котлин, расположенного в Финском заливе, недалеко от Санкт-Петербурга. Разработчики из компании JetBrains, создававшие данный проект, в большинстве своем, также имеют русские корни. Идея разработки, очевидно, состояла в “рукотворной эволюции” для Java: сохранить совместимость с уже существующими библиотеками Java, но оптимизировать процессы, расширить функции, повысить безопасность кодирования и многое прочее. Официальная презентация прошла в 2011 году на конференции Google I/O.

Создавая новый язык, разработчики учли удачные решения своих коллег, а также распространенные проблемы или неудобства, с которыми обычно сталкиваются программисты. Неудивительно, что готовый продукт быстро заслужил признание у сообщества разработчиков, по сей день являясь официальным и самым популярным языком для приложений под Android. JetBrains также предусмотрели кроссплатформенную компиляцию, создали интегрированную среду разработки IntelliJ IDEA. Помимо нее Kotlin поддерживается многими другими популярными IDE:

  • Android Studio;

  • Eclipse (поддержка через плагин);

  • Visual Studio Code (поддержка через плагин).

Насколько и почему популярен Kotlin?

Со времен конференции Google I/O 2019, Гугл настоятельно рекомендует писать новые приложения для Android именно на Kotlin, тем более как раз на нем написана универсальная платформа Firebase, популярнейшие сервисы Google Maps/Places/Home, множество приложений Google Play, приложения и сервисы других известных компаний. Среди примеров, не нуждающихся в представлении:

  • Ozon (написано мобильное приложение);

  • Uber (написано мобильное приложение);

  • Pinterest (переписали код одними из первых);

  • Atlassian (облачные сервисы Jira);

  • Adobe (серверные решения).

Популярность языка во многом объясняется гибкостью и безопасностью работы с ним, относительно простым синтаксисом, совместимостью со старыми базами Java, возможностью кроссплатформенной компиляции, разработки серверных приложений. Кроме того, это бесплатный Open-Source продукт. Большое сообщество разработчиков с активной поддержкой от Гугл имеет тенденцию к росту. Новые расширения и библиотеки призваны облегчить разработку, повысить оптимизацию (со скоростью компиляции на больших проектах бывают проблемы даже по сравнению с Java).

Например, новый плагин KSP, пришедший на замену kapt, позволяет вам писать для компилятора свои оптимизирующие плагины. Используя аннотации, вы можете автоматизировать рутинные процессы, сократив время разработки, повысив качество и безопасность кода. По утверждениям создателей, в идеале KSP способен работать в 2 раза быстрее предшественника. С некоторыми библиотеками, такими как Room, мы и правда замечали рост производительности.

Преимущества программирования на Kotlin

Данный язык является объектно-ориентированным и статически типизированным в то же время. С этим уже связаны определенные преимущества. Статическая типизация подразумевает определение типов переменных на этапе компиляции. В процессе программирования тип переменной объявляется явно (smart casts упрощает этот процесс, автоматизируя приведение к типу) и вы получаете обратную связь о типах данных при компиляции. Такая инспекция упреждает ошибки, безопасность кода повышается.

Например, система типов позволяет избежать ошибки NullPointerException. Достигается это за счет введения nullable и non-nullable типов данных, явно указывающих, может ли значение быть null. Безопасный оператор “?” инициирует проверку и обработку null значений, может вызывать методы, обращаться к полям или выполнять другие операции на переменных, которые могут содержать null, без риска вызвать NullPointerException.

val str: String? = null
val length: Int? = str?.length // Если str равно null, то length будет равно null, и нет NPE
data class Person(val name: String?)

val person: Person? = getPerson()
val personName: String? = person?.name // Если person равно null, то personName будет равно null
val result: Int? = a?.b?.c?.d
// Если хотя бы одно из a, b, c равно null, то result будет равно null

А в объектно-ориентированном программировании действует концепция, где объект представляет собой экземпляр класса, объединяющий данные (поля) и методы, оперирующие этими данными. Такая парадигма обеспечивает принципы инкапсуляции, наследования и полиморфизма, что делает код более организованным, повторно используемым, легким в сопровождении.

К примеру, класс с модификатором “sealed”, объединяет все свои подклассы в рамках одной иерархии, исключая лишнее расширение классов в других частях кода. Если он уже используется с выражением “when”, а вы добавляете новый подкласс, компилятор предупредит вас, что новый класс в этом “when” не учтен.

sealed class Result {
    data class Success(val data: String) : Result()
    data class Error(val message: String) : Result()
    object Loading : Result()
}

fun processResult(result: Result) {
    when (result) {
        is Result.Success -> println("Success: ${result.data}")
        is Result.Error -> println("Error: ${result.message}")
        Result.Loading -> println("Loading...")
    }
}

К сильным сторонам следует отнести поддержку функционального программирования. Это: анонимные функции, в том числе с лямбда-выражениями, для простой передачи функции как аргумента; высшие функции, принимающие другие функции как аргумент или возвращающие их как результат; расширения для добавления новых функций к существующим классам без создания подклассов; иммутабельные (неизменяемые) коллекции, соответствующие функциональному стилю программирования. 

И конечно, Kotlin multiplatform (KMP) - разработанная все теми же JetBrains технология, позволяющая одному разработчику писать приложения под разные платформы (мобайл, веб, десктоп, серверная разработка). В контексте мобайла это позволяет программисту сразу писать общий код под Android и iOS. Есть интеграция с Android Studio и Xcode, платформо-специфичные модули для реализации возможностей разных платформ. 

Кратко перечислить основные плюсы можно так:

  • Мультиплатформенность (компиляция/транспиляция в Native/JS);

  • Безопасность типов;

  • Строковые шаблоны;

  • Многофункциональность;

  • Лаконичный, интуитивно понятный синтаксис;

  • Корутины, встроенные в сам язык, а не как библиотечная функция;

  • Удобная работа с исключениями и коллекциями;

  • Data-классы с автогенерацией стандартных методов;

  • Расширяемость классов без необходимости наследования;

  • Полная совместимость с Java.

Недостатки Kotlin

Минусы тоже в наличии. Как уже упоминалось, сообщество часто ругает Kotlin за низкую скорость компилляции в больших проектах. Кого-то это просто раздражает, а для кого-то задержки критичны. Не всегда плагин для компилятора покрывает проблему, но и не всегда дело в нем. Разные библиотеки показывают разную совместимость с плагином. Новые решения по оптимизации, хочется верить, будут, как это случилось при внедрении Kotlin в Android Studio, где проблемы производительности со временем были решены.  

Еще одна проблема — динамическая стандартная библиотека. Во всяком случае, проблема это для программистов, работающих на платформах с ограниченной поддержкой динамических библиотек или при сценариях с использованием встроенных библиотек на уровне системы.

Размер бинарных файлов, созданных в компиляторе обычно несколько больше, чем в Java, хотя это объясняется подключением дополнительных библиотек. Не столько недостаток, сколько фактор, который иногда нужно учесть.

Отложенная инициация переменной до первого обращения к ней (lateinit) может вызвать критические ошибки в программе. Обычно это используется для переменных с типами данных, которые нельзя инициализировать в конструкторе. Такая переменная не может быть null, иначе при попытке доступа к ней до инициации получим исключение UninitializedPropertyAccessException. Использовать следует осторожно — только если вы уверены, что переменная будет инициализирована перед использованием.

Где стоит применять Kotlin?

Конечно, первое, что приходит в голову — разработка приложений для Android, ведь это официальный язык программирования для этой платформы, но не Андроидом единым жив Котлин. Область его применения на самом деле гораздо шире — от написания скриптов до разработки игр.

Помимо написания Android-приложений, применять язык можно:

  • В создании iOS-приложений. Конечно, это чревато ограниченной поддержкой iOS-библиотек, проблемами интеграции с IDE XCode, но в целом такая возможность есть и реализовать ее бывает уместно, если глубокая интеграция с экосистемой iOS не нужна; 

  • В серверной разработке. Создать серверное приложение — выполнимая задача для Kotlin. Язык содержит библиотеки, полезные для обработки асинхронных операций на сервере, поддерживается известными фреймворками (Spring, Ktor, Vert);

  • В разработке Desktop-приложений. Можно создавать кроссплатформенные desktop-приложения с использованием библиотеки JavaFX;

  • В анализе данных, Data Science. Целесообразно применение и в этой области. Совместимость  с Java способствует работе в экосистеме инструментов для анализа данных, например, Apache Spark.

Подытожив, скажу, что хотя возможности Kotlin на данным момент актуальны в первую очередь для создания Android-приложений, его мультиплатформенность относит язык к категории универсальных, а синтаксический сахар, безопасность кодирования и богатый выбор функций часто мотивируют начинающего программиста изучать именно этот язык.

На этом я желаю всем новых свершений, надеюсь, информация была для вас познавательна. Если остались вопросы — буду рада ответить, если есть чем дополнить недостатки или преимущества Kotlin — милости прошу в комменты :)

Комментарии (13)


  1. Kopilov
    27.12.2023 10:32
    +2

    Обсуждая Kotlin для IOS и Desktop, нельзя не упомянуть Compose. Собственно, это один из главных поводов использовать Kotlin Multiplatform.

    Для Data Science кроме поддержки Spark есть поддержка Jupyter и собственная библиотека DataFrame, написанная по образцу Pandas.

    Ну и лично я использую Kotlin для Backend-разработки уже лет пять, в качестве платформы — Quarkus, поддерживающий Kotlin из коробки


    1. HotW
      27.12.2023 10:32

      Мне в последнее время всё более интересен Kotlin для backend. В чём лучше Quarkus перед Spring boot с Kotlin или Ktor?


      1. pmangel
        27.12.2023 10:32

        Quarkus впринципе тоже самое только стратует чуть быстрее. В нативе может что то еще но тут хз не использовал в проде.

        Ktor совсем другая песня - все настраиваем сами. Никаких автостарт и тп. Минус в том же.


      1. Kopilov
        27.12.2023 10:32

        Практического опыта с Spring boot и Ktor у меня, к сожалению, нет. Зато есть опыт с Glassfish. Quarkus мне нравится тем, что поддерживает стандартное (именно стандартное — официальное, а не просто устоявшееся) API Java EE/ Jakarta.

        Вообще, когда выбирали инструмент при формировании команды — Ktor тогда если существовал, то точно был не на хайпе, а Quarkus как раз рекламировался, как новое актуальное решение (не обязательно для Kotlin, а вообще в мире backend), при этом пришёлся по вкусу и сотрудникам, работавшим со Spring boot («то же самое, только аннотации другие»), и работавшим с Glassfish («то же самое, только сборка и развёртывание проще»). А Ktor, как уже написали, совсем другой.

        Углубляясь дальше в историю, до выбора Quarkus у меня и коллег был практический опыт с Ceylon (единственная статья в профиле тому подтверждение). Там был свой встроенный HTTP-фреймворк, оставивший у команды впечатление «смело, оказывается, без Spring / Java EE можно жить». Вот на него Ktor, наверно, и похож больше всего. Можно сравнить code snippet-ы на лендингах https://ktor.io/ и https://web.archive.org/web/20150304034532/http://ceylon-lang.org/ — выглядит, как попытка передать один и тот же посыл.


  1. eugrus
    27.12.2023 10:32

    Можно ли использовать Kotlin и не наткнуться на необходимость выучить Java?


    1. Beholder
      27.12.2023 10:32

      Java как язык - может и не придётся, но придётся Java как платформу, стандартную библиотеку и, возможно, основы байт-кода.


      1. slonoten
        27.12.2023 10:32

        Эх... Я пытался в Котлин 3 года назад, и тогда был Kotlin Native, но сырой. Как сейчас с ним дела? Как с поддержкой в , VS Code? Или только IDE от Jetbrains? Без maven и Gradle можно жить?


  1. Naf2000
    27.12.2023 10:32

    Я уже писал, но повторюсь. Очень хочется деревья выражений как в linq c# для трансляции в SQL, например


    1. Beholder
      27.12.2023 10:32

      DSL на лямбдах (можно inline) к вашим услугам.

      Для примера можно посмотреть https://github.com/JetBrains/Exposed


  1. headliner1985
    27.12.2023 10:32

    На данный момент единственная ниша это мобильные приложения на Андроид, тк гугл не успевает портировать все фичи новых версий java, всё идёт с большой задержкой. Во всех остальных случаях нет смысла, просто используй последнюю версию java и будет тебе счастье. Иначе рискуешь кануть в историю и узкую нишу как например Scala, очередной "убийца" Java)


    1. pmangel
      27.12.2023 10:32

      Все хорошо, только kotlin это jetbrains. И его будущее это back-end - написание бизнес логики. Если бы вы попробовали то поняли что писать обычные сервисы на котлине это песня. Ну и чего в новой джаве нет в котлине?


  1. Juranja
    27.12.2023 10:32

    У меня такой вопрос , можно ли научится писать на котлине самому , соответственно по курсам , книгам итд. И есть ли смысл ? Из того , что я знаю на базовом уровне это html css ,js php- так себе )))


    1. Creazard Автор
      27.12.2023 10:32

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