- Урок 1. Разработка на Kotlin. Установка Android Studio
- Установка Android Studio на компьютер
- Что такое Kotlin и с чем его едят: обучающее руководство и сравнение нового языка Android-разработки с Java
- Авторизуйтесь
- Что такое Kotlin и с чем его едят: обучающее руководство и сравнение нового языка Android-разработки с Java
- Null-безопасность
- Гибкость и простота синтаксиса
- Отличия от Java
- Null-безопасность
- Классы данных (Data Classes)
- Функции-расширения
- Умные приведения типов
- Вывод типов
- Функциональное программирование
- Сравнение скорости Java и Kotlin
- Будущее Kotlin
- Переход на Kotlin в Android-проекте: Tips and Tricks
- Why Kotlin?
- Приложение DISCO
- Коротко об архитектуре
- Миграция по слоям
- Слой Presentation
- 1. Kapt annotation processor
- 2. Inline functions
- 3. Extensions
- 4. Лямбда-функции и функции высшего порядка
- 5. Платформенные типы
- Слой Domain
- 1. RxJava
- 2. Деструктуризация
- Слой Data
- Выводы
- Книги, полезные ссылки, ресурсы
Урок 1. Разработка на Kotlin. Установка Android Studio
В первом уроке курса по разработке андроид-приложений на языке Kotlin мы установим необходимые средства для разработки приложений, такие как среда разработки Android Studio.
Этот курс предполагает, что вы знакомы с основами программирования. Если вы немного умеете читать код, вы должны разобраться, даже если у вас нет большого опыта программирования. Если вы не знакомы с основами программирования, то мы рекомендуем посмотреть хотя-бы несколько уроков курса CS50.
Установка Android Studio на компьютер
В этом курсе мы создадим приложение Android на языке Kotlin, используя официальную среду разработки Android Studio. Android Studio — это IDE, созданная на базе программного обеспечения IntelliJ IDEA от JetBrains специально для разработки Android-приложений. Для создания приложений в Kotlin необходимо установить Android Studio 3.0 или более поздней версии.
Среда Android Studio доступна для компьютеров под управлением Windows, Mac и Linux. Установка практически аналогична для всех платформ. Некоторые различия описаны в подробной инструкции по установке на нашем сайте fandroid.info.
Примечание: Последние сведения о системных требованиях и инструкциях по установке содержатся в официальной документации на сайте developer.android.com/studio.
Если вы используете компьютер, на котором уже установлена Android Studio версии 3.0 и выше, переходите к следующему уроку, в котором мы создадим первый проект.
Android Studio использует инструменты Java Develipment Kit в работе. До недавнего времени перед установкой Android Studio нужно было скачать и установить JDK версии 7 или 8 с официального сайта Oracle. Сейчас такой необходимости нет, поскольку Android Studio уже содержит встроенный пакет инструментов JDK.
Если вам необходимо установить официальный JDK, следуйте инструкции Установка JDK (Java Development Kit) на нашем сайте fandroid.info, ссылка под видео.
Установка Android Studio
На данный момент доступна для загрузки версия Android Studio 3.0.
Скачайте дистрибутив для вашей операционной системы
В процессе скачивания можно ознакомится с видео инструкциями по установке Android Studio для вашей операционной системы.
- Запустите дистрибутив для установки
- Примите настройки по умолчанию для всех шагов.
- Убедитесь, что выбраны все компоненты для установки
- После завершения установки Мастер установки загружает и устанавливает дополнительные компоненты. Будьте терпеливы, потому что это может занять некоторое время в зависимости от скорости вашего интернет-соединения.
- После завершения загрузки Android Studio запускается, и вы готовы к созданию первого проекта.
К созданию проекта мы перейдем в следующем уроке, а пока на стартовом экране откройте в меню Configure> SDK Manager, который управляет всеми установленными компонентами среды разработки.
На вкладке SDK Platforms можно увидеть, что загружена только последняя версия Android. Нужно пометить для загрузки несколько последних версий, самых популярных на текущий момент, и скачать их. Процесс загрузки и распаковки происходит автоматически, вам следует только набраться терпения и дождаться его окончания. После окончания установки вы увидите в окне SDK Manager, что выбранные компоненты помечены как загруженные.
Самые популярные версии Android на текущий момент можно посмотреть в статистике на официальном сайте https://developer.android.com/about/dashboards/index.html
Возможные проблемы: Если имя пользователя ПК в Windows написано кириллицей, то Android Studio не будет правильно работать, поскольку среда разработки не читает кириллицу в пути к файлам. Переименуйте пользователя английскими буквами.
При возникновении проблем с установкой вы можете задать вопросы в комментариях под видео на канале Start Android и в комментариях ниже. Кроме того, вы можете воспользоваться различными форумами по программированию, такими как StackOverFlow. Обычно бывает достаточно ввести часть текста ошибки в поиске на StackOverFlow, чтобы найти подсказку к решению проблемы.
На этом наш урок подошел к завершению. А на следующем уроке мы создадим проект в среде разработки Android Studio и запустим первое приложение на андроид-устройстве.
Источник
Что такое Kotlin и с чем его едят: обучающее руководство и сравнение нового языка Android-разработки с Java
Авторизуйтесь
Что такое Kotlin и с чем его едят: обучающее руководство и сравнение нового языка Android-разработки с Java
Kotlin — это относительно молодой язык от российской компании JetBrains. Появился он в 2011 году. На конференции Google I/O 2017 команда разработчиков Android сообщила, что Kotlin получил официальную поддержку для разработки Android-приложений.
Как и Java, C и C++, Kotlin — это статически типизированный язык. Он поддерживает как объектно-ориентированное, так и процедурное программирование. По аналогии с вышеупомянутыми языками, основной код Kotlin-программы пишется в функции main , которой передаётся массив аргументов командной строки:
Вот основные возможности и преимущества Kotlin:
- компилируется в байткод JVM или в JavaScript;
- программы могут использовать все существующие Java-фреймворки и библиотеки. Kotlin можно интегрировать с Maven, Gradle и другими системами сборки;
- язык очень прост для изучения;
- исходный код открыт;
- в IntelliJ доступна автоматическая конвертация Java-кода в Kotlin и наоборот;
- язык null-безопасен — надоедливые NullPointerException остались в Java. Вот пример кода:
- легко читаемый синтаксис не составит проблем при code review.
Разберём некоторые из них поподробнее.
Null-безопасность
При попытке присваивания или возвращения null код не скомпилируется. Тем не менее, в языке есть поддержка Nullable-типов. Задать такую переменную или функцию можно, приписав ? к названию типа:
Гибкость и простота синтаксиса
Простые функции и структуры можно объявить одной строкой. Геттеры и сеттеры задаются за кулисами для интероперабельности с Java-кодом. Добавление data-аннотации к классу активирует автоматическую генерацию различных шаблонов.
Рассмотрим следующий пример:
Отличия от Java
Null-безопасность
Как уже говорилось ранее, Kotlin не допускает возникновения NullPointerException, выдавая ошибку компиляции.
Классы данных (Data Classes)
В Kotlin появились специальные классы, предназначенные специально для хранения данных. Они генерируют различные шаблоны: equals() , hashCode() , toString() , геттеры и сеттеры и т.д. Сравните код на Java:
Легко создавать копии классов данных при помощи метода copy() :
Функции-расширения
Kotlin позволяет расширять функциональность существующих классов, не прибегая к наследованию. Это делается при помощи функций-расширений. Для объявления такой функции к её имени нужно приписать префикс в виде расширяемого типа. Вот так можно добавить функцию swap в MutableList :
Ключевое слово this внутри функции-расширения относится к объекту-получателю, который передаётся перед точкой. Теперь мы можем применить функцию swap к любому изменяемому списку:
Умные приведения типов
Компилятор Kotlin очень умён, когда речь заходит о приведениях типов. В большинстве случаев не требуется явно указывать операторы приведения, поскольку в языке есть оператор is , который делает за вас всю работу:
Вывод типов
В Kotlin необязательно явно указывать тип переменной:
Функциональное программирование
Важно отметить, что Kotlin заточен под функциональное программирование. Он предоставляет большое количество полезных возможностей, например, функции высшего порядка, лямбда-выражения, перегрузку операторов и ленивые вычисление логических выражений. Вот пример работы с коллекциями:
Функции высшего порядка — это функции, которые принимают другие функции в качестве аргументов и возвращают функции. Рассмотрим следующий пример:
В нём func — это имя аргумента, а ( ) -> Unit — это тип функции. Мы говорим, что func будет функцией, не принимающей аргументов и ничего не возвращающей.
Лямбда-выражения, или анонимные функции — это функции, которые не объявляются, а передаются в виде выражений. Вот пример:
Мы объявляем переменную sum , которая берёт два числа, складывает их и принимает значение суммы, приведённое к целому. Для вызова достаточно простого sum(2,2) .
Сравнение скорости Java и Kotlin
Первая сборка Kotlin-кода занимает примерно на 15–20% больше времени, чем аналогичный процесс на Java. Однако инкрементная сборка Kotlin даже немного быстрее, чем у Java. Таким образом, языки примерно равны по скорости компиляции.
Будущее Kotlin
Kotlin — это следующий этап развития Java, с которой он полностью совместим. Это делает его отличным инструментом для мобильных и энтерпрайз-приложений. А поскольку Kotlin теперь является официальным языком Android, можно не бояться, что, изучив его, вы останетесь без работы.
Revolut , Удалённо , По итогам собеседования
В изучении этого языка вам поможет серия статей, описывающая процесс создания простого мобильного приложения Keddit — клиента для популярного ресурса Reddit. Все ее части для вашего удобства мы перечислили в списке ниже.
Вам потребуются следующие библиотеки:
- Retrofit 2.0;
- RxJava;
- Picasso;
- RecyclerView;
- Расширения Kotlin для Android;
- Dagger 2.
Все исходники доступны на GitHub. Серия состоит из следующих частей:
Если вам удобнее видеоформат, обратите внимание на русскоязычный видеокурс по Kotlin.
Источник
Переход на Kotlin в Android-проекте: Tips and Tricks
Автор: Сергей Ешин, Strong Middle Android Developer, DataArt
Уже более полутора лет прошло с тех пор, как Google объявил об официальной поддержке Kotlin в Android, а самые матерые разработчики начали экспериментировать с ним в своих боевых и не очень проектах больше трех лет назад.
Новый язык тепло приняли в Android-сообществе, и подавляющая часть новых проектов на Android стартует с Kotlin на борту. Важно и то, что Kotlin компилируется в JVM-байткод, следовательно, полностью совместим с Java. Значит, в существующих Android-проектах, написанных на Java, тоже есть возможность (более того — потребность) задействовать все фичи Kotlin, благодаря которым он и приобрел столько поклонников.
В статье я расскажу об опыте миграции Android-приложения с Java на Kotlin, трудностях, которые пришлось преодолеть в процессе, и объясню, почему все это было не зря. Статья в большей степени рассчитана на Android-разработчиков, только начинающих изучение Kotlin, и кроме личного опыта, опирается на материалы других членов сообщества.
Why Kotlin?
Кратко опишу фичи Kotlin, из-за которых я перешел на него в проекте, покинув «уютный и до боли знакомый» мир Java:
- Полная совместимость с Java
- Null safety
- Выведение типов
- Extension methods
- Функции как объекты первого класса и лямбды
- Generics
- Coroutines
- Отсутствие checked exception
Приложение DISCO
Это небольшое по объему приложение для обмена скидочными картами, состоящее из 10 экранов. На его примере мы и рассмотрим миграцию.
Коротко об архитектуре
Приложение использует MVVM-архитектуру с Google Architecture Components под капотом: ViewModel, LiveData, Room.
Также, согласно принципам Clean Architecture от Uncle Bob, я выделил в приложении 3 слоя: data, domain и presentation.
С чего начать? Итак, мы представляем себе основные фичи Kotlin и имеем минимальное представление о проекте, который нужно смигрировать. Возникает естественный вопрос «с чего начать?».
На странице официальной документации Android «Начало работы с Kotlin» написано, что, если вы хотите перенести существующее приложение на Kotlin, просто должны начать писать модульные тесты. Когда вы приобретете небольшой опыт работы с этим языком, пишете новый код на Kotlin, существующий Java-код вы должны будете просто конвертировать.
Но есть одно «но». Действительно, простая конвертация обычно (хотя далеко не всегда) позволяет получить рабочий код на Kotlin, однако его идиоматичность оставляет желать лучшего. Дальше я расскажу, как устранить этот пробел за счет упомянутых (и не только) фич языка Kotlin.
Миграция по слоям
Поскольку приложение уже разбито на слои, выполнять миграцию имеет смысл по слоям, начиная с верхнего.
Очередность слоев в ходе миграции показана на следующей картинке:
Мы неслучайно начали миграцию именно с верхнего слоя. Мы тем самым избавляем себя от использования Kotlin-кода в Java-коде. Наоборот, мы делаем так, чтобы Kotlin-код верхнего слоя использовал Java-классы нижнего слоя. Дело в том, что Kotlin изначально проектировался с учетом необходимости взаимодействия с Java. Существующий код Java может быть вызван из Kotlin естественным способом. Мы без труда можем наследоваться от существующих Java-классов, обращаться к ним и применять Java-аннотации к Kotlin-классам и методам. Код на Kotlin также может быть использован в Java без особых проблем, но на это часто требуются дополнительные усилия, например, добавление JVM-аннотации. А зачем делать лишние преобразования в Java-коде, если в итоге он все равно будет переписан на Kotlin?
Для примера посмотрим на генерацию перегрузок.
Обычно, если вы пишете функцию Kotlin со значениями параметров по умолчанию, она будет видна в Java только как полная сигнатура со всеми параметрами. Если вы хотите предоставить многократные перегрузки вызовам Java, можно использовать аннотацию @JvmOverloads:
Для каждого параметра со значением по умолчанию это создаст одну дополнительную перегрузку, которая имеет этот параметр и все параметры справа от него, в удаленном списке параметров. В этом примере будет создано следующее:
Примеров использования JVM-аннотаций для корректной работы Kotlin можно привести множество. На этой странице документации подробно раскрывается тема вызова Kotlin из Java.
Теперь опишем процесс миграции слой за слоем.
Слой Presentation
Это слой пользовательского интерфейса, содержит экраны с вьюшками и ViewModel, в свою очередь, содержащую свойства в виде LiveData c данными из модели. Далее мы рассмотрим приемы и инструменты, которые оказались полезны при миграции этого слоя приложения.
1. Kapt annotation processor
Как и во всяком MVVM, View привязывается к свойствам ViewModel за счет databinding. В случае Android мы имеем дело с Android Databind Library, которая использует annotation processing. Так вот у Kotlin есть свой annotation processor, и если не внести правки в соответствующий build.gradle файл, проект перестанет собираться. Поэтому мы эти правки внесем:
Важно помнить, что нужно полностью заменить все вхождения annotationProcessor конфигурации в вашем build.gradle на kapt.
Например, если вы в проекте используете библиотеки Dagger или Room, которые также под капотом задействуют annotation processor для кодогенерации, необходимо указать kapt в качестве annotation processor.
2. Inline functions
Помечая функцию как inline, мы просим компилятор поместить ее по месту использования. Тело функции становится встраиваемым, иными словами, оно подставляется вместо обычного использования функции. Благодаря этому мы можем обойти ограничение type erasure, т. е. стирания типа. При использовании inline-функций мы можем получить тип (класс) в runtime.
Эта особенность Kotlin была использована в моем коде для «извлечения» класса запускаемой Activity.
reified — обозначение овеществляемого типа.
В описанном выше примере мы также коснулись такой фичи языка Kotlin, как Extensions.
3. Extensions
Они же расширения. В extensions выносились утилитные методы, что позволило избежать раздутых и монструозных утилит классов.
Приведу пример расширений, задействованных в приложении:
Разработчики Kotlin подумали о полезных расширениях для Android заранее, предложив свой плагин Kotlin Android Extensions. Среди возможностей, которые он предлагает, можно выделить View binding и поддержку Parcelable. Подробную информацию о возможностях этого плагина можно найти здесь.
4. Лямбда-функции и функции высшего порядка
С помощью лямбда-функций в Android-коде можно избавиться от неуклюжих ClickListener и сallback, которые в Java реализовывались посредством самописных интерфейсов.
Пример использования лямбда вместо onClickListener:
Также лямбда используются в функциях высшего порядка, например, для функций работы с коллекциями.
Возьмем для примера map:
В моем коде есть место, где нужно «намапить» id карточек для их последующего удаления.
При помощи лямбда-выражения, переданного в map, получаю искомый массив id:
Обратите внимание, что круглые скобки можно вообще не указывать при вызове функции, если лямбда — единственный аргумент, а ключевое слово it — неявное имя единственного параметра.
5. Платформенные типы
Вам неизбежно придется работать с SDK, написанными на Java (включая, собственно, Android SDK). Значит, нужно всегда оставаться настороже с такой особенностью Kotlin and Java Interop как платформенные типы.
Платформенный тип — это тип, для которого Kotlin не может найти информацию о допустимости null. Дело в том, что по умолчанию код на Java не содержит информацию о допустимости null, а NotNull и @Nullable-аннотации используются далеко не всегда. Когда соответствующая аннотация в Java отсутствует, тип становится платформенным. С ним можно работать и как с типом, допускающим null, и как с типом, null не допускающим.
Это означает, что точно как в Java, разработчик несет полную ответственность за операции с этим типом. Компилятор не добавляет рантайм проверки на null и разрешит вам делать все.
В следующем примере мы переопределяем onActivityResult в нашем Activity:
В данном случае data — платформенный тип, который может содержать null. Однако, с точки зрения Kotlin-кода, data не может быть null ни при каких обстоятельствах, и вне зависимости от того, укажете ли вы тип Intent как nullable, вы не получите ни предупреждения, ни ошибки от компилятора, так как оба варианта сигнатуры допустимы. Но поскольку получение непустой data не гарантировано, т. к. в случаях с SDK вы не можете это проконтролировать, получение null в данном случае приведет к NPE.
Также в качестве примера можно перечислить следующие места возможного появления платформенных типов:
- Service.onStartCommand(), где Intent может быть null.
- BroadcastReceiver.onReceive().
- Activity.onCreate(), Fragment.onViewCreate() и прочие похожие методы.
Причем бывает так, что параметры метода аннотированы, но студия почему-то теряет Nullability при генерации override.
Слой Domain
Этот слой включает в себя всю бизнес-логику, он отвечает за взаимодействие между слоем данных и презентационным слоем. Ключевую роль здесь играет Repository. В Repository мы проводим необходимые манипуляции с данными, как с серверными так и локальными. Наверх, в слой Presentation, мы отдаем лишь метод интерфейса Repository, скрывающий всю сложность действий с данными.
Как было указано выше, для реализации была использована RxJava.
1. RxJava
Kotlin полностью совместим с RxJava и более лаконичен в связке с ней, нежели Java. Однако и здесь мне пришлось столкнуться с одной неприятной проблемой. Звучит она так: если передать лямбду в качестве параметра метода andThen, данная лямбда не выполнится!
Чтобы убедиться в этом, достаточно написать простой тест:
Содержимое andThen не выполнится. Это в случае с большинством операторов (вроде flatMap, defer, fromAction и множества других) в качестве аргументов ожидается действительно лямбда. А при такой записи с andThen ожидается Completable/Observable/SingleSource. Проблема решается использованием обыкновенных круглых скобок () вместо фигурных <>.
2. Деструктуризация
Также коснемся такого интересного синтаксиса Kotlin как деструктуризация или деструктуризирующее присваивание. Он позволяет присвоить объект сразу нескольким переменным, разбив его на части.
Представим, что у нас есть метод в API, возвращающий сразу несколько сущностей:
Компактный способ вернуть результат из данного метода — деструктуризация, как показано на следующем примере:
Стоит упомянуть, что мультидекларации опираются на конвенцию: классы, которые предполагается деструктурировать, должны содержать функции componentN(), где N — соответствующий номер компонента — члена класса. Т. е. Приведенный выше пример транслируется в следующий код:
В нашем примере используется data-класс, который автоматически объявляет componentN() функции. Поэтому мультидекларации работают с ним из коробки.
Более подробно о data-классе поговорим в следующей части, посвященной слою Data.
Слой Data
Этот слой включает в себя POJO для данных с сервера и базы, интерфейсы для работы и с локальными данными, и с данными, полученными с сервера.
Для работы с локальными данными была использована Room, предоставляющая нам удобную обертку для работы с базой данных SQLite.
Первая цель для миграции, которая напрашивается сама собой — POJO, которые в стандартном коде Java представляют собой объемные классы с множеством полей и соответствующих им get/set методов. Сделать POJO более лаконичными можно с помощью Data-классов. Одной строчки кода будет достаточно, чтобы описать описать сущность с несколькими полями:
Помимо лаконичности мы получим:
- Переопределенные методы equals(), hashCode() и toString() под капотом. Генерация equals по всем свойствам data-класса крайне удобна при использовании DiffUtil в адаптере, который генерирует вьюшки для RecyclerView. Дело в том, что DiffUtil сравнивает два набора данных, два списка: старый и новый, выясняет, какие изменения произошли, и с помощью notify-методов оптимально обновляет адаптер. И как правило, элементы списка сравниваются с помощью equals.
Таким образом, после добавления нового поля в класс нам не нужно его дописывать еще и в equals c тем, чтобы DiffUtil учитывал новое поле.
Еще одна хорошая новость: при настроеном kapt (что описано выше) Data-классы прекрасно работают с Room-аннотациями, что позволяет все сущности базы данных перевести в Data-классы. Также Room поддерживает nullable свойства. Правда, Room пока не поддерживает значения по умолчанию от Kotlin, но на это уже заведен соответствующий баг.
Выводы
Мы рассмотрели только немногие подводные камни, которые могут возникнуть в процессе миграции с Java на Kotlin. Важно, что, хотя проблемы и возникают, особенно при недостатке теоретических знаний или практического опыта, все они решаемы.
Однако удовольствие от написания краткого выразительного и безопасного кода на Kotlin с лихвой окупит все трудности, что возникнут на пути перехода. Могу сказать с уверенностью, что пример проекта DISCO это безусловно подтверждает.
Книги, полезные ссылки, ресурсы
- Теоретический фундамент знания языка позволит заложить книга Kotlin in Action от создателей языка Светланы Исаковой и Дмитрия Жемерова.
Источник