Сегодня я решил написать о самых главных нововведениях в Kotlin 1.4.0. Думаю, что начинающим Android разработчикам будет очень интересна данная тема и они смогут применить новые фишки в своих приложениях. Также, я надеюсь, что моя статья будет полезна и для профессиональных разработчиков, которые очень любят и помогают развивать Kotlin.
Основные темы, которые я затрону:
-
Нововведения в синтаксисе
-
Новые инструменты в IDE
-
Новые компилятор
-
Качество и производительность
Ну что ж, предлагаю вам налить себе кофе или чай, запастись сладеньким и можно начинать)
Немного о релизах Kotlin
На момент написания статьи самыми новыми релизами были:
Релиз |
Дата и краткое описание |
|
Kotlin 1.4.0 |
17 августа, 2020, основной пласт нововведений, который мы сегодня рассмотрим. Улучшение производительности, введение новых синтаксических конструкций и добавление новых функций в IDE. |
|
Kotlin 1.4.10 Kotlin 1.4.20 Kotlin 1.4.21 |
7 сентября, 2020, исправление багов для Kotlin 1.4.0 23 ноября, 2020, несколько улучшений, такие как производительность и поддержка новых функций для JVM. 7 декабря, 2020, исправление ошибок для Kotlin 1.4.20 |
Нововведения в синтаксисе
SAM - интерфейсы
Одной из самых важных и довольно полезных фишек является добавление нового синтаксиса для SAM интерфейсов (SAM - Single Abstract Method, также интерфейс с одним методом называют функциональным).
Чтобы указать компилятору Kotlin о том, что перед нами SAM
интерфейс нужно использовать ключевое слов fun
, как
ниже в примере:
fun interface ItemSelectListener {fun onItemSelect(position: Int): String}val items = listOf("Item 1", "Item 2", "Item 3")val myListener = ItemSelectListener { position ->items[position]}fun main() { print("selected item -> ${myListener.onItemSelect(0)}")}
Одно из применений: передача обработчиков событий в адаптер RecyclerView для отслеживания нажатия на элемент списка.
Данный подход сокращает количество строк кода и вводит дополнительные удобства.
Явный API режим
Kotlin предлагает новый явный API режим для разработчиков библиотек.
Основные моменты:
-
Явный API режим помогает делать API библиотек чистым и последовательным
-
Накладывает различные требования и ограничения на публичные API:
-
Строгое использование модификаторов доступа
-
Явное указание типов для свойств и функций, которые являются частью публичного API
-
-
Некоторые определения исключены из проверок: свойства data классов, первичные конструкторы и т.д.
Смешанные именованные и позиционные параметры
Довольно легко объяснить на примере. До Kotlin 1.4.0 нельзя было делать так:
fun foo(a: Int, b: String = "", c: Int) {}fun main() {foo(a = 10, "Hello, World", c = 100000)}
В данном примере мы сначала указываем именованный параметр, а
потом позиционный (строка "Hello, World"
). В ранних
версиях Kotlin нужно было всегда указывать сначала позиционные.
Конечная запятая
Довольное удобно при обмене строк или копировании параметров функций
fun reformat(str: String, wordSeparator: Char = ' ', // конечная запятая) { // TODO}
Улучшения вызываемых ссылок на функции
Теперь вы можете использовать ссылки на функции, которые имеют default аргументы:
fun foo(a: Int = 0): String = "value -> $a" // параметр 'a' имеет значение по умолчанию 0fun apply(f: () -> String): String = f()fun main() { println(apply(::foo))}
Вы можете использовать ссылки на функции, которые возвращают
любое тип, там где требуются функции возвращающие
Unit
.
Например у нас есть функция foo
, которая принимает
другую функцию, которая ничего не возращает (Unit
). Мы
можем передать ей любую ссылку на функцию, у которой совпадает
количество аргументов, а возвращаемый тип может быть любой:
fun foo(f: () -> Unit) { }fun returnValue(): Int = 42fun main() { foo { returnValue() } // Так было до Kotlin 1.4.0 foo(::returnValue) // начиная с Kotlin 1.4.0 можно передать сюда функцию, // которая возвращает любой тип}
Вы можете адаптировать ссылки на функции, когда передается переменное количество аргументов:
fun foo(a: Int, vararg words: String) {}fun useCase0(f: (Int) -> Unit) {}fun useCase1(f: (Int, String) -> Unit) {}fun useCase2(f: (Int, String, String) -> Unit) {}fun test() { useCase0(::foo) useCase1(::foo) useCase2(::foo) }
В дополнение появилась поддержка передачи ссылки на функцию, там
где используется ключевое слово suspend
fun lockUI() {}fun takeSuspend(f: suspend () -> Unit) {}fun test() { takeSuspend { lockUI() } // до Kotlin 1.4.0 takeSuspend(::lockUI) // В Kotlin 1.4.0 можно сделать так}
Использование breakandcontinueвнутриwhenвыражений, включенных в цикл for
В Kotlin 1.4.0 вы можете использовать ключевые слова
break
и continue
в операторе
when
, когда он вложен в циклfor
(до этого
нужно было создавать метки, более подробно)
fun foo(numbers: List<Int>) { for (num in numbers) { when { num % 2 == 0 -> continue num == 10 -> break else -> println(x) } }}
Новые инструменты в IDE
Новое гибкое окно создания проекта
Теперь вы можете создавать и конфигурировать различные типы проектов Kotlin более гибко и специфично:
Новое окно создания проекта позволяет:
-
Выбрать шаблон проекта (в будущем будет добавлено больше шаблонов)
-
Выбрать систему сборки (Gradle, Maven)
-
Посмотреть структуру проекта до его создания
-
Добавить/удалить модули, поддерживаемые данным шаблоном проекта
-
Настроить JVM версию, framework для тестирования и другие вещи.
Отладчик Корутин
Очень много разработчиков на Kotlin используют всеми известные корутины (а как же без них).
До Kotlin 1.4.0 приходилось полагаться на введение логов и умственные усилия разработчика, чтобы отлаживать программы с наличием корутин.
Теперь появился новый инструмент, который находится в Debug Tool Window в Intellij IDEA, который позволяет:
-
Легко проверить состояние каждой корутины
-
Посмотреть значения локальных и захваченных переменных для корутин
-
Посмотреть полный стек создания корутины, а также стек внутри корутины (все фрэймы с локальными переменными)
-
Также можно получить полный отчет, воспользовавшись функцией Get Coroutines Dump
Новый компилятор
Главной целью создания нового компилятора было соответствие характеристикам:
-
Скорость
-
Создание общего интерфейса для разных платформ, которые поддерживает Kotlin
-
Обеспечение API для расширения компилятора
Основные улучшения по сравнению с предыдущим компилятором:
-
Новый более мощный алгоритм для автоматического вывода типов с поддержкой более сложных сценариев вывода типов и с улучшенниями для делегированных свойств. (данный алгоритм уже был доступен в версии Kotlin 1.3 при указании дополнительных опций, в новой версии он будет использоваться по умолчанию). Вы можете найти более десятка исправленных багов и ошибок в новом алгоритме на YouTrack
-
Унифицированный backend компилятора (в Kotlin есть несколько backend, такие как: Kotlin/JVM, Kotlin/JS и Kotlin/Native. Последний был основан на промежуточном представлении (IR) для Kotlin кода)
Сейчас компания JetBrains работает над более производительной frontend реализацией.
Frontend - это часть компилятора, которая разбирает код, разрешает имена, выполняет проверки типов и многое другое.
Качество и производительность
Одной из главных целей данного релиза является улучшение производительности и стабильности IDE, фокус на вещах, которые важны для разработчиков, а также сделать Kotlin более продуктивным и быстрым.
Основные улучшения:
-
Было исправлено более 60 ошибок производительности, включая большое количество случаев зависания IDE и утечек памяти
-
Прирост в скорости IDE, который можно увидеть, пройдя по ссылке (здесь время подсвечивания синтаксиса Kotlin при открытии большого проекта). Также на рисунке ниже показано время срабатывания автодополнения (которое уменьшилось по сравнению с предыдущими релизами)
-
И многие другие, которые напрямую связаны с созданием нового компилятора.