Узнайте больше о языке программирования Котлин. Я расскажу, где применяется 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)
eugrus
27.12.2023 10:32Можно ли использовать Kotlin и не наткнуться на необходимость выучить Java?
Beholder
27.12.2023 10:32Java как язык - может и не придётся, но придётся Java как платформу, стандартную библиотеку и, возможно, основы байт-кода.
slonoten
27.12.2023 10:32Эх... Я пытался в Котлин 3 года назад, и тогда был Kotlin Native, но сырой. Как сейчас с ним дела? Как с поддержкой в , VS Code? Или только IDE от Jetbrains? Без maven и Gradle можно жить?
Naf2000
27.12.2023 10:32Я уже писал, но повторюсь. Очень хочется деревья выражений как в linq c# для трансляции в SQL, например
Beholder
27.12.2023 10:32DSL на лямбдах (можно inline) к вашим услугам.
Для примера можно посмотреть https://github.com/JetBrains/Exposed
headliner1985
27.12.2023 10:32На данный момент единственная ниша это мобильные приложения на Андроид, тк гугл не успевает портировать все фичи новых версий java, всё идёт с большой задержкой. Во всех остальных случаях нет смысла, просто используй последнюю версию java и будет тебе счастье. Иначе рискуешь кануть в историю и узкую нишу как например Scala, очередной "убийца" Java)
pmangel
27.12.2023 10:32Все хорошо, только kotlin это jetbrains. И его будущее это back-end - написание бизнес логики. Если бы вы попробовали то поняли что писать обычные сервисы на котлине это песня. Ну и чего в новой джаве нет в котлине?
Juranja
27.12.2023 10:32У меня такой вопрос , можно ли научится писать на котлине самому , соответственно по курсам , книгам итд. И есть ли смысл ? Из того , что я знаю на базовом уровне это html css ,js php- так себе )))
Creazard Автор
27.12.2023 10:32Смысл обучаться есть всегда, но результат зависит от обучаемости и прежнего опыта. Всегда легче освоить новый язык, хорошо владея другим. Все индивидуально, большинству людей нужен хороший наставник, кто-то справляется сам.
Kopilov
Обсуждая Kotlin для IOS и Desktop, нельзя не упомянуть Compose. Собственно, это один из главных поводов использовать Kotlin Multiplatform.
Для Data Science кроме поддержки Spark есть поддержка Jupyter и собственная библиотека DataFrame, написанная по образцу Pandas.
Ну и лично я использую Kotlin для Backend-разработки уже лет пять, в качестве платформы — Quarkus, поддерживающий Kotlin из коробки
HotW
Мне в последнее время всё более интересен Kotlin для backend. В чём лучше Quarkus перед Spring boot с Kotlin или Ktor?
pmangel
Quarkus впринципе тоже самое только стратует чуть быстрее. В нативе может что то еще но тут хз не использовал в проде.
Ktor совсем другая песня - все настраиваем сами. Никаких автостарт и тп. Минус в том же.
Kopilov
Практического опыта с 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/ — выглядит, как попытка передать один и тот же посыл.