Новый язык программирования котлин. Язык программирования Kotlin

Официальным языком для разработки на Android.

Почему Kotlin назвали в честь острова в Финском заливе, как и когда язык стал популярен среди разработчиков мобильных приложений, почему им удобно пользоваться и зачем он изначально понадобился? Маркетинг-менеджер Kotlin Роман Белов рассказал «Бумаге» , как в Петербурге создавали язык, признанный Google.

Фото из архива Романа Белова

Как и когда появился язык программирования Kotlin?

Мы начали разрабатывать Kotlin в 2010 году. К тому времени компании JetBrains было уже десять лет и основной продукт компании - JetBrains IntelliJ IDEA, полностью написанный на Java, - был уже очень большого размера. Стало понятно, что во многом Java нас не устраивает. Было несколько альтернативных языков программирования, но оказалось, что ни один из них не соответствует тем требованиям, которые мы выдвигаем к языку, на который хотели бы перейти.

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

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

Почему Kotlin называется именно так?

В тот момент, когда придумывалось название, на JVM (Java Virtual Machine - прим. «Бумаги» ) существовали еще языки, названные в честь островов: Java, Ceylon. И мы подумали: какой у нас есть остров рядом? Котлин. И это название прижилось. Тут нет какой-то традиции или правила, но так случилось, какой-то более глубокой мысли за этим нет.

В чем особенности языка?

Наверное, самое удачное слово, которое подходит к языку Kotlin, - это прагматичность. Языки бывают разные: некоторые выходят из академической среды, другие созданы для конкретных платформ. Мы изначально были нацелены на практичный язык для максимально широкой аудитории. Он должен был быть демократичным, то есть без заумных вещей. Бывают ситуации, когда программист знает все тонкости языка и благодаря этому пишет хитрый код, - и в этот код никто из джуниор-программистов не может лезть. Нам нужен язык, который одинаково хорош как для начинающих программистов, так и для продвинутых.

Внутри компании у нас также полная демократия: каждый программист сам решает, на каком языке писать, на Java или на Kotlin, и далеко не все переходят на Kotlin. Для меня как для маркетинг-менеджера языка JetBrains - это маленький мир. Когда в нашей большой компании все перейдут на Kotlin, тогда, наверное, и во всем мире программисты перейдут на него. Но, действительно, процент использования Kotlin в компании неизменно растет.

Чем же Kotlin так хорош? В первую очередь разработчики любят Kotlin за его краткость и выразительность. Это свойственно всем новым языкам. Раньше людей это не очень смущало, потом размер программ стал больше - люди поняли, что пишут очень много совершенно бессмысленных кусков кода только потому, что от них это требует синтаксис языка программирования.

Вторая причина в том, что он полностью совместим с Java и позволяет постепенно мигрировать с Java-приложения на Kotlin-приложение. Например, приложение Basecamp в течение полугода полностью мигрировало с Java на Kotlin.

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

Как Kotlin заметили разработчики приложений?

В JetBrains мы не занимаемся Android-разработкой и изначально никто не думал, что Kotlin будет языком, который так удачно подойдет для целей Android-разработчиков. Но в какой-то момент оказалось, что Android застрял на Java 6 и очень многие новые фичи Java на Android недоступны. Тогда прогрессивные разработчики обратили внимание на Kotlin.

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

Год назад у нас произошло довольно большое событие: система сборки Gradle, с помощью которой собираются все приложения для Android, объявила о переходе на Kotlin.

В каком-то смысле история с Kotlin на Android - совершенно сказочная и хрестоматийная: мы просто делали язык программирования, и он очень нравился разработчикам. Это история про движение снизу вверх, а не наоборот. Разработчики давно просили Google поддержать Kotlin. И Google к ним прислушался.

С анонсом от Google формально для нас ничего не меняется: мы продолжаем разрабатывать язык и нацелены на разные платформы. Естественно, мы предвкушаем особое внимание к языку со стороны Android-разработчиков: оно будет, в частности, выражено в сообщениях об ошибках, в запросах на поддержку той или иной функциональности, и, естественно, мы будем всё это обрабатывать. Но в целом, конечно, продолжим двигаться по намеченному пути.

Кто и зачем использует язык Kotlin?

В компании мы начали применять Kotlin года с 2012-го, но официальный релиз языка был 17 февраля 2016 года. До этого времени конструкции языка активно менялись и поддерживать код на Kotlin было достаточно проблематично. Надо понимать, что развитие языков программирования требует большого внимания к обратной совместимости. И когда мы заявили о релизе, взяли на себя обязательство по обратной совместимости: по тому, что новый код будет совместим на бинарном уровне со старым. И мы эти обязательства выполняем.

Сейчас язык Kotlin в своих приложениях используют такие российские компании, как Avito и «Рокет Банк». За прошлый год Kotlin опробовали 160 тысяч программистов. До сегодняшнего дня Kotlin показывал экспоненциальный рост по числу программистов, и, думаю, объявление Google поможет нам продолжить этот рост.

18.05.2017, Чт, 14:39, Мск , Текст: Александр Корнев

Разработчики из Google сделали Kotlin языком первого класса для ОС Android, отметив при этом, что он пока не станет заменой основному «первоклассному» языку Java.

Kotlin как язык первого класса для Android

В четверг на ежегодной конференции Google I/O разработчики сообщили о том, что созданный российскими программистами язык Kotlin станет «языком первого класса» для написания приложений для Android. Как пишет TechCrunch, в Google также рассказали об организации совместно с создателями языка - компанией JetBrains - специального фонда для развития Kotlin.

В Google подчеркнули, что Kotlin будет дополнительным языком и ни в коем случае не заменит Java и C++ (на сегодняшний день языком первого класса для Android является именно Java). Планируется, что инструменты Kotlin, основанные на JetBrains IDE, будут по стандарту включены в Android Studio 3.0 - официальный инструмент разработки для ОС Android.

«Поскольку Kotlin полностью поддерживается Java, вы и раньше могли писать приложения на нем, однако теперь это будет поддержано авторитетом и репутацией Google», - отмечают журналисты.

Google переводит Android на язык Kotlin, созданный в России

При этом Google не становится владельцем Kotlin. Права по-прежнему будут принадлежать JetBrains. Язык продолжит работать с другими платформами, к примеру, в качестве нативного кода для iOS и Mac или для компилирования кода JavaScript для веб-приложений.

В конкурентной борьбе со Swift

Kotlin - статически типизированный язык программирования, работающий поверх JVM, компилирующийся в JavaScript. Язык разрабатывается с 2010 г., его исходный код был открыт в 2012 г. Свое название Kotlin получил в честь острова Котлин в Финском заливе, на котором расположен Кронштадт.

Напомним, весной 2016 г. в Google о перспективе разработки приложений под Androidна Swift - языке программирования для iPhone и iPad. И тогда же в качестве возможного альтернативного языка был назван Kotlin. Сперва Swift был внутренним проектом Apple, но позже его исходный код был открыт разработчикам.

Сообщалось, что возможной причиной поиска замены для Java могли стать проблемы юридического плана с корпорацией Oracle, которая настаивает на том, что Google нарушила ее авторское право и патенты. Эксперты отмечали, что для адаптации Swift к Android потребовалась бы разработка новой среды исполнения для мобильной ОС, адаптация стандартной библиотеки, обеспечение поддержки языка в интерфейсах программирования (API) и инструментарии разработчика и т. д.

От Kotlin язык Swift отличается, по мнению экспертов, более высокой производительностью. Среди плюсов Kotlin отмечается уже упомянутая полная совместимость с JavaScript.

Fun main(args: Array) { val numbers = arrayListOf(15, -5, 11, -39) val nonNegativeNumbers = numbers.filter { it >= 0 } println(nonNegativeNumbers) } // Вывод: 15, 11

Функции высшего порядка - это функции, которые принимают другие функции в качестве аргументов и возвращают функции. Рассмотрим следующий пример:

Fun alphaNum(func: () -> Unit) {}

В нём func - это имя аргумента, а () -> Unit - это тип функции. Мы говорим, что func будет функцией, не принимающей аргументов и ничего не возвращающей.

Лямбда-выражения, или анонимные функции - это функции, которые не объявляются, а передаются в виде выражений. Вот пример:

Val sum: (Int, Int) -> Int = { x, y -> x + y }

Мы объявляем переменную sum , которая берёт два числа, складывает их и принимает значение суммы, приведённое к целому. Для вызова достаточно простого sum(2,2) .

Сравнение скорости Java и Kotlin

Первая сборка Kotlin-кода занимает примерно на 15–20% больше времени, чем аналогичный процесс на Java. Однако инкрементная сборка Kotlin даже немного быстрее, чем у Java. Таким образом, языки примерно равны по скорости компиляции.

Будущее Kotlin

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

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

Вам потребуются следующие библиотеки:

  • Retrofit 2.0;
  • RxJava;
  • Picasso;
  • RecyclerView;
  • Расширения Kotlin для Android;
  • Dagger 2.

Все исходники доступны на GitHub . Серия состоит из следующих частей.

2017 поднялся новый хайп вокруг ЯП (Язык Программирования) Котлин, и на этом фоне я хочу рассказать вам также и о других новшествах в разработке программ для смартфонов на базе операционной системы Android. Но это мой личный блог, а не какой-то там академический ресурс, и поэтому вначале я позволю себе некоторые лирические отступления в сторону, обернув свой взор в прошлое.

Исторический экскурс

Первое моё знакомство с программированием смартфонов, работающих под управлением операционной системы Android, произошло в начале 2012 года , то есть ровно 6 лет назад. В те далёкие времена Google ещё не создал свою великолепную IDE (Integrated Development Environment, Интегрированная Среда Разработки) Android Studio, и я в IDE Eclipse с установленным плагином ADT (Android Development Tools, Инструменты разработчика Android) . Поводом к знакомству явилась покупка моего первого смартфона HTC Desire HD менее чем за год до этого, в начале лета 2011 года.

Родным языком программирования для Android считалась Java. Это был новый для меня язык, поэтому у меня возникла тройная сложность: новая IDE, новый ЯП и новая ОС (Операционная Система) , и это всё одновременно. Тем не менее, я худо-бедно научился писать программы под Android, и даже написал один коммерческий продукт, за что с удовольствием получил поощрение в €1000.

Тем не менее, программирование под Android было крайне неудобным, о чём я даже периодически . Тут и несовершенство IDE, и неразвитость стандартных библиотек в направлении Android, и их , и глюкавость всего этого по отдельности.

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

В 2014-м году появилась первая стабильная версия IDE от самого Гугла (правда, основанная на IDE IntelliJ IDEA, написанной в юридически Чешской компании JetBrains, основанной в Праге тремя российскими программистами) .

Вообще, всё началось с российской компании StarSoft , которая начала свою деятельность сразу после августовского путча 1991 года на базе лаборатории программного обеспечения при Независимой Гуманитарной Академии в Санкт-Петербурге, и состояла тогда из трёх человек. В 1993 году началась работа над проектом Together (средство проектирования ПО) , идея которого была предложена приехавшим из Германии немцем . В 1995 году компания была переименована в STAR SPb и официально зарегистрировалась как российское представительство STAR Group. В 1999 году из STAR SPb выделилась «российско-немецкая» компания TogetherSoft, состоявшая из специалистов, работавших над продуктом Together. В числе соучредителей как всегда оказались американцы, которые решили, что хороших программистов нужно срочно вывозить из Питера в Европу, и в том же 1999 году топовая команда TogetherSoft (около 50 человек) уехала в Прагу. Среди них были и три будущих основателя компании JetBrains . И вот, в 2000 году ими была основана компания JetBrains, и зарегистрирована там же, где они на тот момент и жили, в Праге.

Флагманским продуктом JetBrains является IntelliJ IDEA — IDE для многих языков программирования. Её то и взял за основу Гугл для своей IDE Android Studio . К слову, сооснователь Гугла тоже из России. Чуть копнёшь — и везде торчат российские корни... Он родился в Москве и жил там до 5 лет, а затем его семья в 1979 году эмигрировала в америку, как тогда это было принято у евреев. Из-за антисемитизма, в частности, наличия квот для евреев для поступления в ВУЗы и университеты. Сначала евреи, как народ, обособляются, всячески подчёркивают свою богоизбранность и не скрывают свой не всегда приемлемый менталитет в регионах с иной доминирующей религией и иным менталитетом, а потом удивляются результату. Впрочем, это уже другая тема. Несмотря на его, мягко говоря, скептическое отношение к своей бывшей родине (а что ещё можно ожидать от человека, воспитанного советскими эмигрантами) , я вполне разделяю его взгляды, в частности, на Интернет. Да и многие критические высказывания в адрес России вполне себе справедливы, хотя и неприятны, будучи слышимы из уст иностранца. Впрочем, я опять отвлёкся...

Итак, когда появилась Android Studio, и я сразу перешёл на неё, как на потенциально более перспективную для разработки под Андроид IDE. Надо сказать, что вначале были заметны как её плюсы, так и минусы по сравнению с Eclipse. Тем не менее плюсов было намного больше, и я прочно подсел на неё.

Как любитель, я программирую нерегулярно, и последний 2017 год в части Android пропустил вообще. И вот сейчас я решил обновить IDE и посмотреть, что там вообще появилось нового за пропущенное время. И оказалось, что появилось то там дофига существенного! Ниже я перечислю некоторые особо заметные нововведения, которые я оцениваю очень положительно.

Новый язык программирования Котлин

До недавнего времени Android Studio поддерживала программирование только на языке Java (Джава, ранее чаще говорили Ява. Язык назван в честь марки кофе, которая, в свою очередь, названа в честь острова в Индонезии) и на C++ для нативного кода. Язык Java — не сказать, чтобы очень старый, но, учитывая относительно молодую направленность его применения (мультиплатформенность) , довольно поживший. Он был разработан известной компанией Sun Microsystems в 1995 году. Изначально язык назывался Oak («Дуб») , и разрабатывался для программирования бытовых электронных устройств. Затем он был переименован в Java и стал использоваться для написания клиентских приложений и серверного программного обеспечения. Позже появились и другие его применения.

Замечу, что Java работает в паре с компилятрорм, который не выдаёт полноценный код для его выполнения в операционной системе. Исходные тексты, написанные на этом языке, компилируются в специальный байт-код, который выполняется на специальной виртуальной машине, дополнительно установленной в системе, и переводящей этот код в понятные операционной системе и процессору команды. Таким образом, программы, написанные на этом языке, могут выполняться на любом устройстве, в котором установлена такая виртуальная машина. А виртуальные машины Java написаны уже для самых разных архитектур. Этим и достигается мультиплатформенность программ. Минусом такого подхода является увеличенное время их выполнения за счёт дополнительной прослойки в виде виртуальной машины между кодом и процессором. Также программы на Java зачастую работают медленнее из-за несовершенства многих Java-библиотек, например, библиотек графического интерфейса. Но всё это плата за мультиплатформенность.

И вот, совсем недавно, в конце 2017 года, вышла Android Studio 3.0, которая наряду с языком Java и С++ стала поддерживать язык Kotlin (Котлин) , который, как и Java, предгазначен для создания того же самого байт-кода для той-же виртуальной машины, но имеет другой синтаксис, позволяющий писать намного более компактные исходники. Вместе с тем, файлы с исходниками на обоих языках можно без ограничений смешивать в одном проекте, что даёт возможность постепенно перевести весь проект на Котлин.

Язык совсем свежий. Он начал разрабатываться в 2010 году, был представлен общественности в 2011-м, программировать на нём под Android стало возможным с 2012 года, а официальный релиз был выпущен совсем недавно, в 2016 году. Кстати, по традиции (как и Java) язык назван в честь острова. На этот раз это российский остров Котлин в Финском заливе, на котором расположен город Кронштадт. А разработан язык питерскими программистами всё в той же компании JetBrains! О как, реальный российский язык программирования! [Патриотам размахивать флагами, а автор этого поста уже вовсю ходит кругами по комнате, грозно помахивая древком...]

Я уже попробовал писать на этом языке под Android, и могу с уверенностью заявить, что язык вполне себе годный. Ранее я терялся в Java-коде, потому что в Android надо прописывать всё и вся, и получались очень длинные простыни исходников. В итоге исходники разрастались до неприличных размеров, и их приходилось мелко дробить на классы, распихивая их в разные файлы, и тогда я уже терялся в файлах. В Kotlin же используется философия «всё, что можно сгенерировать автоматически, надо генерировать автоматически». С одной стороны, код становится менее прозрачный (минус, но, разве что, только для новичков) , но более простой и компактный (большой плюс для всех).

Компактность кода достигается не только за счёт сокращённых конструкций синтаксиса, но и за счёт штатных библиотек, способ применения которых специально заточен на компактность и эргономичность использования. Примером этому могут служить сопрограммы (или, как калька с английского, корутины) . Сопрограммы — это очень понятный компактный способ оформления кода, который должен выполняться асинхронно основному потоку. Никаких дополнительных классов с методами отдельно прописывать не надо, всё делается прямо в основном коде, и это прекрасно! Кроме того, сопрограммы реализованы на уровне самой библиотеки, и не создают тяжеловесных системных потоков. Их даже называют легковесными потоками. Поэтому ограничений на их одновременно запущенное количество практически не существует. Сопрограммы бесподобны!

Архитектурные компоненты для Android от Google

Также очень компактным оказалось создание и использование базы данных SQLite с помощью библиотеки Room , являющейся обёрткой над известным классом SQLiteOpenHelper. Для использования Room достаточно описать два маленьких класса, описывающих таблицу и базу данных и один маленький интерфейс, описывающий функции взаимодействия с этой базой данных. Это всё в Котлине даже нет необходимости рассовывать в разные файлы. На основе этой мизерной информации Room воспроизведёт все действия, которые раньше приходилось расписывать в огромных файлах, автоматически и внутри себя. Чудеса!

В реальных приложениях нужно отслеживать изменения данных в базе и автоматически обновлять информацию в визуальных компонентах. Поэтому компонент Room чаще всего используется не сам по себе, а вместе с компонентом LiveData из библиотеки android.arch.lifecycle . Этот компонент также используется элементарно. Данные, которые необходимо отслеживать, передаются из базы в переменную не напрямую, а в виде класса LiveData, принявшего внутри Room эти данные в виде параметра. После этого в основном коде одной строкой Котлина задаётся наблюдение за ними и функция обновления визуального компонента, которая запускается при изменении данных. Всё элементарно!

Ещё один полезный компонент из библиотеки android.arch.lifecycle , решающий головную боль с сохранением данных активности при поворотах экрана — ViewModel. Раньше приходилось писать всякие хитроумные костыли для того, чтобы данные не терялись, а вычисления не прерывались. Теперь для этого есть официальный компонент! Если раньше мы отделяли интерфейс от кода (разметка и активность) , то теперь настало время отелять код, который должен работать только в период жизненного цикла активности (например, обеспечение функционирования интерфейса с пользователем) , от кода, который должен работать вне привязки к конкретному жизненному циклу активности (например, получение, обработка и передача данных) . При этом результат работы второй части кода мы можем автоматически прочитать в пересозданной после поворота экрана активности.

Для реализации всей этой схемы с ViewModel тоже требуется минимум действий. Пишется отдельный класс с кодом, который не должен прерываться (т.н. модель вида, почему «модель» — не знаю; может, перевожу неправильно) , а в основном коде одной строкой вызывается провайдер моделей, в который этот класс передаётся в качестве параметра. Провайдер либо возвращает существующий объект класса модели (после поворота экрана) , либо создаёт такой объект по переданному классу, если такового ещё нет, и тоже возвращает его (при первом запуске активности) . Активность всегда может обращаться к функциям и переменным этого объекта.

Все три компонента объединены под официальным названием Android Architecture Components (Архитектурные Компоненты для Android). Правда, туда ещё входит компонент LifeCycle, тоже находящийся в библиотеке android.arch.lifecycle , но он используется в плотной связке с LiveData, и я бы его вообще не выделял. Появление таких высокоуровневых компонентов — долгожданный шаг Google в правильном направлении. Я давно уже ругался на то, как много разных классов нужно расширить самому и соединить их все друг с другом, чтобы заставить работать что-то чуть большее, чем примитивные примеры из учебников для начинающих. И вот, наконец, среди библиотек стали появляться правильные компоненты. Надеюсь, что эта тенденция продолжится.

Визуальный редактор интерфейса

На этом обнаруженные мною новшества в программировании смартфонов не заканчиваются. С самого рождения в Android Studio было очень тяжко со стабильностью и предсказуемостью работы визуального редактора интерфейса, хотя он и был постабильнее, чем в Eclipse. Даже непосредственно редактируя xml-разметку интерфейса, очень сложно было настроить все эти Layout"ы и другие визуальные компоненты так, чтобы они отображались в нужных местах и в нужном виде.

К счастью, в Android Studio, начиная с версии 2.2, вместо гиморного построения интерфейса через макеты линейного расположения элементов (LinearLayout) предлагается использовать новый макет принудительного расположения (ConstraintLayout) . Кроме того, визуальный редактор, наконец, доведён до ума. Всё это вместе дало очень положительный эффект. Теперь правильно расположить элементы не так сложно, и ведут они себя вполне предсказуемо.Теперь можно даже не трогать xml-разметку, а все действия выполнять в визуальном редакторе.

Эта статья рассказывает о языке программирования Kotlin. Вы узнаете о причинах появления проекта, возможностях языка и посмотрите несколько примеров. Статья написана в первую очередь в расчете на то, что читающий знаком с языком программирования java, однако, знающие другой язык, тоже смогут получить представление о предмете. Статья носит поверхностный характер и не затрагивает вопросы связанные с компиляцией в javascript. На официальном сайте проекта вы можете найти полную документацию, я же постараюсь рассказать о языке вкратце.

О проекте

Не так давно компания JetBrains , занимающаяся созданием сред разработки, анонсировала свой новый продукт - язык программирования Kotlin. На компанию обрушилась волна критики: критикующие предлагали компании одуматься и доделать плагин для Scala, вместо того, чтобы разрабатывать свой язык. Разработчикам на Scala действительно очень не хватает хорошей среды разработки, но и проблемы разработчиков плагина можно понять: Scala, которая появилась на свет благодаря исследователям из Швейцарии, вобрала в себя многие инновационные научные концепции и подходы, что сделало создание хорошего инструмента для разработки крайне непростой задачей. На данный момент сегмент современных языков со статической типизацией для JVM невелик, поэтому решение о создании своего языка вместе со средой разработки к нему выглядит очень дальновидным. Даже если этот язык совсем не приживется в сообществе - JetBrains в первую очередь делает его для своих нужд. Эти нужды может понять любой java-программист: Java, как язык, развивается очень медленно, новые возможности в языке не появляются (функции первого порядка мы ждем уже не первый год), совместимость со старыми версиями языка делает невозможным появление многих полезных вещей и в ближайшем будущем (например, приличной параметризации типов). Для компании, разрабатывающей ПО язык программирования - основной рабочий инструмент, поэтому эффективность и простота языка - это показатели, от которых зависит не только простота разработки инструментов для него, но и затраты программиста на кодирование, т. е. насколько просто будет этот код сопровождать и разбираться в нем.

О языке

Язык статически типизирован. Но по сравнению с java, компилятор Kotlin добавляет в тип информацию о возможности ссылки содержать null, что ужесточает проверку типов и делает выполнение более безопасным:

Fun foo(text:String) { println(text.toLowerCase()) // NPE? Нет! } val str:String? = null // String? -- тип допускающий null-ы foo(str) // <- компилятор не пропустит такой вызов -- // тип str должен быть String, чтобы // передать его в foo

Несмотря на то, что такой подход может избавить программиста от ряда проблем связанных с NPE, для java-программиста поначалу это кажется излишним - приходится делать лишние проверки или преобразования. Но через некоторое время программирования на kotlin, возвращаясь на java, чувствуешь, что тебе не хватает этой информации о типе, задумываешься об использовании аннотаций Nullable/NotNull. С этим связаны и вопросы обратной совместимости с java - этой информации в байткоде java нет, но насколько мне известно, этот вопрос еще в процессе решения, а пока все приходящие из java типы - nullable.

Кстати, об обратной совместимости: Kotlin компилируется в байткод JVM (создатели языка тратят много сил на поддержку совместимости), что позволяет использовать его в одном проекте с java, а возможность взаимно использовать классы java и Kotlin делают совсем минимальным порог внедрения Kotlin в большой уже существующий java-проект. В этой связи важна возможность использовать множественные java-наработки, создавая проект целиком на kotlin. Например, мне почти не составило труда сделать небольшой проект на базе spring-webmvc.

Посмотрим фрагмент контроллера:

Path(array("/notes/")) controller class NotesController { private autowired val notesService: NotesService? = null path(array("all")) fun all() = render("notes/notes") { addObject("notes", notesService!!.all) } //... }

Видны особенности использования аннотаций в Kotlin: выглядит местами не так аккуратно, как в java (касается это частных случаев, например, массива из одного элемента), зато аннотации могут быть использованы в качестве «самодельных» ключевых слов как autowired или controller (если задать алиас типу при импорте), а по возможностям аннотации приближаются к настоящим классам.

Надо заметить, что Spring не смог обернуть kotlin-классы для управления транзакциями - надеюсь, в будущем это будет возможно.

В языке есть поддержка first-class functions. Это значит, что функция - это встроенный в язык тип для которого есть специальный синтаксис. Функции можно создавать по месту, передавать в параметры другим функциям, хранить на них ссылки:

Fun doSomething(thing:()->Unit) { // объявляем параметр типа функция // ()->Unit ничего не принимает и // ничего важного не возвращает thing() // вызываем } doSomething() { // а здесь на лету создаем функцию типа // ()->Unit и передаем её в функцию doShomething // если функция -- последний параметр, можно // вынести её за скобки вызова println("Hello world") }

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

Fun List.filter(condition:(T)->Boolean):List { val result = list() for(item in this) { if(condition(item)) result.add(item) } return result } val someList = list(1, 2, 3, 4).filter { it > 2 } // someList==

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

Чтобы проиллюстрировать тему классов и краткости, посмотрим на следующий код:

// создание bean-классов становится // немногословным, поля можно объявить // прямо в объявлении конструктора class TimeLord(val name:String) // класс может вообще не иметь тела class TARDIS(val owner:TimeLord) fun main(args:Array) { val doctor = TimeLord("Doctor") val tardis = TARDIS(doctor) println(tardis.owner.name) }

В нескольких строках мы смогли объявить два класса, создать два объекта и вывести имя владельца ТАРДИСа! Можно заметить, что класс объявляется с параметрами своего единственно возможного конструктора, которые одновременно являются и объявлением его свойств. Предельно коротко, но при этом информативно. Наверняка найдутся те, кто осудит невозможность объявить больше одного конструктора, но мне кажется, что в этом есть свой прагматизм - ведь несколько конструкторов в java или позволяют объявить параметры по-умолчанию, что Kotlin поддерживает на уровне языка, или преобразовать один тип к другому, с которым и будет это класс работать, а это уже можно спокойно отдать на откуп фабричному методу. Обратите своё внимание на объявление «переменных» и полей. Kotlin заставляет нас сделать выбор: val или var . Где val - объявляет неизменяемую final -ссылку, а var - переменную, чем помогает избежать повсеместного использования изменяемых ссылок.

Пример

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

Так я бы хотел, чтобы выглядело использование:

Fun main(args: Array) { // создаем небольшое дерево val tree= tree("root") { node("1-1") { node("2-1") node("2-2") } node("1-2") { node("2-3") } } // обходим его и выводим значения в консоль tree.traverse { println(it) } }

Теперь попробуем это реализовать. Создадим класс узла дерева:

/** * @param value данные узла */ class Node(val value:T) { // дети узла private val children:List> = arrayList() /** * Метод, который создает и добавляет ребенка узлу * @param value значение для нового узла * @param init функция инициализации нового узла, необязательный * параметр */ fun node(value:T, init:Node.()->Unit = {}):Node { val node = Node(value) node.init() children.add(node) return node } /** * Метод рекурсивно обходит все дочерние узлы начиная с самого * узла, о каждом узле оповещается обработчик * @param handler функция обработчик для значения каждого узла */ fun traverse(handler:(T)->Unit) { handler(value) children.forEach { child -> child.traverse(handler) } } }

Теперь добавим функцию для создания вершины дерева:

/** * Создает вершину дерева со значением value и инициализирует * её детей методом init. */ fun tree(value:T, init:Node.()->Unit): Node { val node = Node(value) // вызываем метод init, переданный в // параметр, на объекте ноды node.init() return node }

В двух местах кода была использована конструкция вида Node.()->Unit, её смысл в том, что на вход ожидается тип-функция, которая будет выполняться как метод объекта типа Node. Из тела этой функции есть доступ к другим методам этого объекта, таким как метод Node.node(), что позволяет сделать инициализацию дерева, подобную описанной в примере.

Вместо заключения

За счет хорошей совместимости с java и возможности заменять старый код постепенно, в будущем Kotlin мог бы стать хорошей заменой java в больших проектах и удобным инструментом для создания небольших проектов с перспективой их развития. Простота языка и его гибкость дает разработчику больше возможностей для написания быстрого, но качественного кода.

Если вас заинтересовал язык, всю информацию о языке можно найти на официальном сайте проекта, ихсодники на github-е, а найденные ошибки постить в Issue Tracker. Проблем пока много, но разработчики языка активно с ними борются. Сейчас команда работает над пока еще не очень стабильной версией milestone 3, после стабилизации, насколько мне известно, планируется использовать язык внутри компании JetBrains, после чего уже планируется выход первого релиза.

Теги:

  • kotlin
  • java
  • jetbrains
Добавить метки