Что такое Kotlin и с чем его едят: обучающее руководство и сравнение нового языка Android-разработки с Java
Авторизуйтесь
Что такое Kotlin и с чем его едят: обучающее руководство и сравнение нового языка Android-разработки с Java
Kotlin — это относительно молодой язык от российской компании JetBrains. Появился он в 2011 году. На конференции Google I/O 2017 команда разработчиков Android сообщила, что Kotlin получил официальную поддержку для разработки Android-приложений.
Вот основные возможности и преимущества Kotlin:
Разберём некоторые из них поподробнее.
Null-безопасность
Гибкость и простота синтаксиса
Простые функции и структуры можно объявить одной строкой. Геттеры и сеттеры задаются за кулисами для интероперабельности с Java-кодом. Добавление data-аннотации к классу активирует автоматическую генерацию различных шаблонов.
Рассмотрим следующий пример:
Отличия от Java
Null-безопасность
Как уже говорилось ранее, Kotlin не допускает возникновения NullPointerException, выдавая ошибку компиляции.
Классы данных (Data Classes)
Легко создавать копии классов данных при помощи метода copy() :
Функции-расширения
Kotlin позволяет расширять функциональность существующих классов, не прибегая к наследованию. Это делается при помощи функций-расширений. Для объявления такой функции к её имени нужно приписать префикс в виде расширяемого типа. Вот так можно добавить функцию swap в MutableList :
Ключевое слово this внутри функции-расширения относится к объекту-получателю, который передаётся перед точкой. Теперь мы можем применить функцию swap к любому изменяемому списку:
Умные приведения типов
Вывод типов
В Kotlin необязательно явно указывать тип переменной:
Функциональное программирование
Важно отметить, что Kotlin заточен под функциональное программирование. Он предоставляет большое количество полезных возможностей, например, функции высшего порядка, лямбда-выражения, перегрузку операторов и ленивые вычисление логических выражений. Вот пример работы с коллекциями:
Функции высшего порядка — это функции, которые принимают другие функции в качестве аргументов и возвращают функции. Рассмотрим следующий пример:
Лямбда-выражения, или анонимные функции — это функции, которые не объявляются, а передаются в виде выражений. Вот пример:
Сравнение скорости Java и Kotlin
Первая сборка Kotlin-кода занимает примерно на 15–20% больше времени, чем аналогичный процесс на Java. Однако инкрементная сборка Kotlin даже немного быстрее, чем у Java. Таким образом, языки примерно равны по скорости компиляции.
Будущее Kotlin
Kotlin — это следующий этап развития Java, с которой он полностью совместим. Это делает его отличным инструментом для мобильных и энтерпрайз-приложений. А поскольку Kotlin теперь является официальным языком Android, можно не бояться, что, изучив его, вы останетесь без работы.
13–15 декабря, Онлайн, Беcплатно
В изучении этого языка вам поможет серия статей, описывающая процесс создания простого мобильного приложения Keddit — клиента для популярного ресурса Reddit. Все ее части для вашего удобства мы перечислили в списке ниже.
Вам потребуются следующие библиотеки:
Все исходники доступны на GitHub. Серия состоит из следующих частей:
Если вам удобнее видеоформат, обратите внимание на русскоязычный видеокурс по Kotlin.
Kotlin vs Java
И снова здравствуйте. В преддверии старта нового курса «Backend-разработка на Kotlin», мы подготовили для вас перевод статьи, в которой рассказывается о том, чем же Kotlin отличается от Java.
«Kotlin – новый язык программирования, который заставит вас отказаться от Java». На европейской конференции Zebra APPFORUM 2017 в Праге наш Android-разработчик Питер Оттен вдохновлял других начать писать на Kotlin. Расстроены, что пропустили? Не переживайте! Питер расскажет вам, почему он стал большим поклонником этого языка.
Подъем
Так что же такое Kotlin?
Kotlin был впервые представлен в 2011 году, а в феврале 2016 года появилась его версия 1.0 stable release, затем 1.1 в марте. Язык программирования с открытым исходным кодом компилируется в JVM (Java Virtual Machine), Android и JavaScript. Таким образом, Kotlin может использоваться одновременно на JVM и Android-устройствах (интероперабельность). Также он может запускаться на фронтенде с помощью JavaScript. Google официально объявила на своей конференции I/O в мае, что Kotlin стал официально поддерживаемым языком для Android-разработки. С тех пор интерес к языку, его применение и сообщество выросли в разы.
По сравнению с Java
Для сравнения Java и Kotlin на презентации был приведен в пример класс POJO и то, как его можно использовать (рисунок выше). Здесь можно увидеть всю силу и лаконичность Kotlin, когда простой класс Person (с именем, геттером/сеттером и стандартными методами POJO) заменяется ключевым словом «data». Также, глядя на использование класса Person можно заметить следующие различия:
Выводы Mediaan об использовании Kotlin
После посещения других докладов о Kotlin на Droidcon в 2015 и 2016 в Лондоне и GDG DevFest 2016 в Амстердаме наша команда мобильных разработчиков решила, что пришло время взглянуть на новый язык. Мы начали использовать его в октябре 2016 года и просто влюбились в него. Первый новый проект под Android уже был на 100% написан на Kotlin. С тех пор мы не возвращались к Android-разработке на Java.
Теперь, когда мы оглядываемся назад, на наш опыт работы с Java, и видим то, как используется Kotlin сейчас, можно сделать следующие выводы:
Итак, начнете ли вы с Kotlin или перейдете на него?
Есть множество ссылок, которые помогут вам в его освоении:
Чтобы использовать Kotlin в уже существующем проекте или чтобы полностью перенести существующий проект на него, мы рекомендуем следующий подход:
О будущем
Помимо поддержки JVM, Android и JavaScript, Kotlin работает над поддержкой большего числа платформ. Поддержка машинного кода – это следующий большой шаг. Например, запустить код на RaspBerry Pi уже можно (в бета версии). Jetbrains работает над добавлением поддержки для iOS, MacOS и Windows. Это значит, что Kotlin может однажды стать основной нового кроссплатформенного решения для приложений. Больше информации о дальнейшем развитии вы сможете узнать на KotlinConf, их собственной конференции в конце этого года в Сан-Франциско.
О языке Kotlin для Java-программистов
О проекте
Не так давно компания JetBrains, занимающаяся созданием сред разработки, анонсировала свой новый продукт — язык программирования Kotlin. На компанию обрушилась волна критики: критикующие предлагали компании одуматься и доделать плагин для Scala, вместо того, чтобы разрабатывать свой язык. Разработчикам на Scala действительно очень не хватает хорошей среды разработки, но и проблемы разработчиков плагина можно понять: Scala, которая появилась на свет благодаря исследователям из Швейцарии, вобрала в себя многие инновационные научные концепции и подходы, что сделало создание хорошего инструмента для разработки крайне непростой задачей. На данный момент сегмент современных языков со статической типизацией для JVM невелик, поэтому решение о создании своего языка вместе со средой разработки к нему выглядит очень дальновидным. Даже если этот язык совсем не приживется в сообществе — JetBrains в первую очередь делает его для своих нужд. Эти нужды может понять любой java-программист: Java, как язык, развивается очень медленно, новые возможности в языке не появляются (функции первого порядка мы ждем уже не первый год), совместимость со старыми версиями языка делает невозможным появление многих полезных вещей и в ближайшем будущем (например, приличной параметризации типов). Для компании, разрабатывающей ПО язык программирования — основной рабочий инструмент, поэтому эффективность и простота языка — это показатели, от которых зависит не только простота разработки инструментов для него, но и затраты программиста на кодирование, т. е. насколько просто будет этот код сопровождать и разбираться в нем.
О языке
Язык статически типизирован. Но по сравнению с java, компилятор Kotlin добавляет в тип информацию о возможности ссылки содержать null, что ужесточает проверку типов и делает выполнение более безопасным:
Несмотря на то, что такой подход может избавить программиста от ряда проблем связанных с NPE, для java-программиста поначалу это кажется излишним — приходится делать лишние проверки или преобразования. Но через некоторое время программирования на kotlin, возвращаясь на java, чувствуешь, что тебе не хватает этой информации о типе, задумываешься об использовании аннотаций Nullable/NotNull. С этим связаны и вопросы обратной совместимости с java — этой информации в байткоде java нет, но насколько мне известно, этот вопрос еще в процессе решения, а пока все приходящие из java типы — nullable.
Кстати, об обратной совместимости: Kotlin компилируется в байткод JVM (создатели языка тратят много сил на поддержку совместимости), что позволяет использовать его в одном проекте с java, а возможность взаимно использовать классы java и Kotlin делают совсем минимальным порог внедрения Kotlin в большой уже существующий java-проект. В этой связи важна возможность использовать множественные java-наработки, создавая проект целиком на kotlin. Например, мне почти не составило труда сделать небольшой проект на базе spring-webmvc.
Посмотрим фрагмент контроллера:
Видны особенности использования аннотаций в Kotlin: выглядит местами не так аккуратно, как в java (касается это частных случаев, например, массива из одного элемента), зато аннотации могут быть использованы в качестве «самодельных» ключевых слов как autowired или controller (если задать алиас типу при импорте), а по возможностям аннотации приближаются к настоящим классам.
Надо заметить, что Spring не смог обернуть kotlin-классы для управления транзакциями — надеюсь, в будущем это будет возможно.
В языке есть поддержка first-class functions. Это значит, что функция — это встроенный в язык тип для которого есть специальный синтаксис. Функции можно создавать по месту, передавать в параметры другим функциям, хранить на них ссылки:
Если добавить к этому extension-функции, позволяющие расширить уже существующий класс методом не нарушающим инкапсуляцию класса, но к которым можно обращаться как к методам этого класса, то мы получим довольно мощный механизм расширения достаточно бедных в плане удобств стандартных библиотек java. По традиции, добавим уже существующую в стандартной библиотеке возможность фильтрации списка:
Обратите внимание на то, что у переменных не указаны типы — компилятор Kotlin выводит их, если это возможно и не мешает понятности интерфейса. Вообще, язык сделан таким образом, чтобы максимально избавить человека за клавиатурой от набирания лишних знаков: короткий, но понятный синтаксис с минимум ключевых слов, отсутствие необходимости точек с запятой для разделения выражений, вывод типов, где это уместно, отсутствие ключевого слова new для создания класса — только необходимое.
Чтобы проиллюстрировать тему классов и краткости, посмотрим на следующий код:
Пример
Вот мы и добрались до места, где уже можно сделать что-то более интересное. На собеседованиях я часто даю задание реализовать дерево, сделать его обход и определить какое-то действие с элементом. Давайте посмотрим, как это реализуется в kotlin.
Так я бы хотел, чтобы выглядело использование:
Теперь попробуем это реализовать. Создадим класс узла дерева:
Теперь добавим функцию для создания вершины дерева:
В двух местах кода была использована конструкция вида Node.()->Unit, её смысл в том, что на вход ожидается тип-функция, которая будет выполняться как метод объекта типа Node. Из тела этой функции есть доступ к другим методам этого объекта, таким как метод Node.node(), что позволяет сделать инициализацию дерева, подобную описанной в примере.
Вместо заключения
За счет хорошей совместимости с java и возможности заменять старый код постепенно, в будущем Kotlin мог бы стать хорошей заменой java в больших проектах и удобным инструментом для создания небольших проектов с перспективой их развития. Простота языка и его гибкость дает разработчику больше возможностей для написания быстрого, но качественного кода.
Если вас заинтересовал язык, всю информацию о языке можно найти на официальном сайте проекта, ихсодники на github-е, а найденные ошибки постить в Issue Tracker. Проблем пока много, но разработчики языка активно с ними борются. Сейчас команда работает над пока еще не очень стабильной версией milestone 3, после стабилизации, насколько мне известно, планируется использовать язык внутри компании JetBrains, после чего уже планируется выход первого релиза.
Сравниваем Java и Kotlin
Предлагаю начать с общих черт.
Бесплатны и с открытым кодом
Код преобразуется в байт-код
Объектно-ориентированные языки программирования
1. Статическая типизация
Java и Kotlin являются языками со статической типизацией. Это означает, что проверка типов выполняется во время компиляции. (Существуют также языки с динамической типизацией, например PHP, Python и JavaScript.)
Это хорошо видно из примера ниже.
2. Бесплатны и с открытым кодом
Оба языка являются бесплатными и распространяются как открытое программное обеспечение (можно использовать без ограничений и участвовать в развитии).
3. Байт-код
Оба языка преобразуют код в байт-код, исполняемый JVM.
4. Интероперабельность
Оба языка являются интероперабельными. Это означает, что файлы Java и Kotlin могут сосуществовать в одном проекте или пакете JAR.
5. Поддержка ООП
Оба являются объектно-ориентированными языками программирования.
(Таким образом, они поддерживают основные концепции ООП)
Полиморфизм, наследование, инкапсуляция, абстракция.
А теперь рассмотрим основные отличия.
1. Представление публике и релиз
Язык Java был разработан компанией Sun Microsystems (в настоящее время принадлежит Oracle) в 1995 году.
Он поддерживается практически всеми типами устройств и операционных систем, будь то Android, Windows или Linux.
Язык Kotlin был представлен компанией JetBrains в 2011 году, выложен в открытый доступ в 2012 году, официально поддержан на Google I/O (ежегодном мероприятии разработчиков Google) в 2017 году.
По заявлению Google, 70 % из 1000 лучших приложений для Android сейчас написаны на Kotlin.
Некоторые приложения пока находятся в процессе переноса с Java на Kotlin, например приложение Google Home еще не полностью переписано на Kotlin.
. но по состоянию на июнь 2020 года около 30 % старой кодовой базы на Java уже было переписано на Kotlin.
Другими популярными примерами Kotlin-приложений от Google являются Maps, Play и Drive.
Прочие компании также выпустили множество приложений для Android, написанных на языке Kotlin.
Сейчас при поддержке разработки под Android компания Google придерживается стратегии «Kotlin прежде всего». Это в чем-то похоже на ситуацию с разработкой приложений под iOS, где произошел переход от Objective-C к Swift.
2. Версия
По состоянию на ноябрь 2020 года актуальной версией Kotlin является 1.4.0.
Несмотря на выход Java 15, самой популярной версией все еще остается Java 8 (или 1.8).
3. Скорость
По этому параметру Java превосходит Kotlin на 12–15 % для чистых сборок (то есть в этом случае Kotlin компилируется немного медленнее).
Однако в случае частичных сборок с включенной инкрементной компиляцией (то есть с компиляцией только небольших изменений) Kotlin компилируется так же быстро, как и Java, или даже немного быстрее.
4. Количество строк кода
Код, написанный на Kotlin, намного компактнее по сравнению с Java — на 30–40 %.
Таким образом, в теории размер приложений может уменьшиться на треть.
Язык Java — крайне многословный, а Kotlin — лаконичный и современный.
5. Доля рынка
По данным опросов, разработчиков на Kotlin примерно в пять раз меньше, чем использующих Java.
7,8 % разработчиков предпочитают Kotlin, более чем 40 % — Java. Однако эти опросы также показывают, что Kotlin нравится программистам больше, чем Java, и быстро наращивает аудиторию.
6. Безопасная работа с обнуляемыми переменными (null safety)
Java позволяет разработчикам присваивать значение null любой переменной.
Nullable-типы используются с оператором безопасного вызова.
7. Гибридные приложения
Kotlin можно использовать для написания нативных приложений для Android и iOS.
Kotlin Multiplatform Mobile (KMM) работает в Android и iOS.
Java до последнего времени не использовалась при разработке приложений под iOS.
Теперь рассмотрим СТИЛЕВЫЕ отличия.
Функция main
В Java метод main должен размещаться внутри класса. Он объявляется как статический метод.
В Kotlin, чтобы сделать функцию статической, достаточно поместить ее на уровень пакета. Так что это может быть самостоятельная функция без класса.
Аргументы метода main в Kotlin можно опустить, если наша программа не должна принимать аргументы командной строки.
В Java, если мы не включаем аргументы в функцию main (даже если мы их не используем), выводится ошибка.
2. Поведение по умолчанию
Чтобы разрешить переопределение метода, его необходимо явно пометить как open.
— это одно и то же в Kotlin.
Internal подразумевает повсеместную видимость в одном модуле.
Default обеспечивает видимость в пределах пакета.
Методы с модификатором default позволяют добавлять в интерфейсы новые функциональные возможности.
В Kotlin ключевое слово default не используется.
3. Типы данных и массивы
Изменяемым (mutable) и неизменяемым (immutable) типами в Kotlin являются var и val
В числовых литералах разрешается использовать символы подчеркивания.
Нельзя сравнивать типы разной величины.
Массивы объявляются следующим образом:
4. Списки
Тип List по умолчанию в Kotlin является неизменяемым, поэтому методы add() или remove() работают не так, как в Java.
5. Циклы
В заключение предлагаю рассмотреть функциональные различия.
Конструкторы
В Kotlin доступны два вида конструкторов.
Один из них прописывается после имени класса и называется первичным конструктором, а второй прописывается в теле класса и называется вторичным конструктором.
В классе могут быть один первичный конструктор и несколько вторичных.
Вторичный конструктор должен расширять поведение первичного конструктора.
2. Функции-расширения
Kotlin позволяет разработчикам расширять класс, добавляя новую функциональность при помощи функций-расширений.
Это поистине замечательное улучшение, поскольку программисту не требуется расширять класс.
По сути, функция-расширение — это функция, которая является членом класса, но определена за его пределами.
В Java функций-расширений не было.
3. Функции высшего порядка
В языке Kotlin функция, которая может принимать в качестве параметра функцию или лямбда-выражение или же может возвращать функцию, называется функцией высшего порядка (higher-order function).
4. Data-классы
В больших проектах, как правило, используется несколько классов, предназначенных исключительно для хранения данных.
Разработчику на Java приходится писать много стандартного, но часто встречающегося кода (так называемый шаблонный код или boilerplate ), data-классы в Kotlin позволяют избежать этих дополнительных усилий.
5. Статические члены
Ключевое слово static делает компонент частью класса, не связанной с объектом этого класса.
В концепции ООП то, что не является объектом, существовать не должно.
В Java статические члены обрабатываются не так, как члены-объекты. Это означает, что для статических членов нам недоступны такие вещи, как реализация интерфейса, помещение экземпляра в ассоциативный список (map) или передача его в качестве параметра методу, который принимает объект.
В Kotlin static не является ключевым словом и вместо статических членов используются объекты-компаньоны, позволяющие преодолеть вышеуказанные ограничения.
В этом и заключается преимущество.
Даже если члены объектов-компаньонов выглядят как статические члены в других языках, во время выполнения они все равно остаются членами экземпляров реальных объектов и могут, например, реализовывать интерфейсы.
6. Асинхронная обработка
В Java существует множество решений для асинхронной работы: RxJava, AsyncTask (уже официально не поддерживается), обработчики, обратные вызовы.
Корутины (или легковесные потоки) не являются отдельными потоками, но несколько корутин могут совместно использовать один поток.
7. Проверяемые исключения
8. Ленивая загрузка
В Kotlin модификаторы lateinit и by Lazy позволяют инициализировать значения до их фактического использования.
Оба варианта служат одной цели, но по факту сильно отличаются. Один является неизменяемым ( val ), другой — изменяемым ( var ).
Переменная lateinit может быть инициализирована из любого места, откуда доступен объект.
В свою очередь, Java не поддерживает отложенную инициализацию, поэтому значения инициализируются, даже если они не используются.
Вот некоторые различия между этими двумя мощными языками.
Благодарю за внимание!
Всех желающих приглашаем на открытый урок «Конструкторы и блоки инициализации». На занятии мы:
— Разберём конструктор на запчасти;
— Определим финалистов (финальные переменные);
— Наведём порядок (инициализации).
Java или Kotlin: что выбрать начинающему андроид-разработчику
Если планируете работать в компании, занимающейся Android-разработкой, и перерасти должность джуна, — вам понадобятся два языка.
В 2019 году Google делает Kotlin основным языком под Android, оставляет Java и запутывает начинающих разработчиков: одни делают ставку на универсальность Java, других подкупает синтаксис Kotlin.
Разбираемся, почему это так и в каком порядке учить.
На Java и Kotlin пишут новые приложения
Посмотрим на рейтинги языков программирования во второй половине 2020 года:
Везде один результат: Java в пятёрке, а Kotlin не попадает в десятку — то есть большинство мобильных разработчиков продолжают писать приложения на Java.
Автор статей о программировании. Изучает Python, разбирает сложные термины и объясняет их на пальцах новичкам. Если что-то непонятно — возможно, вы еще не прочли его следующую публикацию.
Теперь посмотрим статистику быстроразвивающихся языков программирования по версиям Octoverse GitHub и Stack Overflow — Kotlin на четвёртом месте. Это показывает, что развитие Kotlin не влияет на популярность Java и пока Android поддерживает два языка — новые приложения будут выпускаться на них обоих.
Java и Kotlin нужны для поддержки написанных приложений
Перейдём на developer.android.com — это официальный сайт платформы Android, где появились отзывы разработчиков о преимуществах языка Kotlin:
Отзывы подкреплены статистикой:
Когда читаешь это, создаётся ощущение, что вся андроид-разработка завязана на Kotlin. Но для понимания ситуации нужно учитывать три момента:
Конфликт Google и Oracle привёл к такой ситуации: Android переходит на Kotlin, а Java растёт и сохраняет запас кода, который Kotlin-сообществу не переписать. Не получится взять объёмное Java-приложение и автоматически компилировать его в Kotlin: языки отличаются и часть приложения нужно редактировать вручную.









