Kotlin — язык программирования: для чего используется, плюсы и минусы
Узнайте больше о языке программирования Котлин. Я расскажу, где применяется Kotlin и почему он оптимален для приложений на Android. Подробнее в блоге CREAZARD.
Приветствую! Меня зовут Громова Алена и я основатель компании мобильной разработки. Этот материал в своем блоге решила посвятить языку Kotlin, как одному из «ходовых» языков программирования, с которыми давно работает моя команда.
Немного копнем в истоки. Само свое название язык получил в честь острова Котлин, расположенного в Финском заливе, недалеко от Санкт-Петербурга. Разработчики из компании JetBrains, создававшие данный проект, в большинстве своем, также имеют русские корни. Идея разработки, очевидно, состояла в «рукотворной эволюции» для Java: сохранить совместимость с уже существующими библиотеками Java, но оптимизировать процессы, расширить функции, повысить безопасность кодирования и многое прочее. Официальная презентация прошла в 2011 году на конференции Google I/O.
Создавая новый язык, разработчики учли удачные решения своих коллег, а также распространенные проблемы или неудобства, с которыми обычно сталкиваются программисты. Неудивительно, что готовый продукт быстро заслужил признание у сообщества разработчиков, по сей день являясь официальным и самым популярным языком для приложений под Android. JetBrains также предусмотрели кроссплатформенную компиляцию, создали интегрированную среду разработки IntelliJ IDEA. Помимо нее Kotlin поддерживается многими другими популярными IDE:
Насколько и почему популярен 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 — милости прошу в комменты :)