Нововведения в Kotlin 1.4.0
Сегодня я решил написать о самых главных нововведениях в 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' имеет значение по умолчанию 0
fun apply(f: () -> String): String = f()
fun main() {
println(apply(::foo))
}
Вы можете использовать ссылки на функции, которые возвращают любое тип, там где требуются функции возвращающие Unit
.
Например у нас есть функция foo
, которая принимает другую функцию, которая ничего не возращает (Unit
). Мы можем передать ей любую ссылку на функцию, у которой совпадает количество аргументов, а возвращаемый тип может быть любой:
fun foo(f: () -> Unit) { }
fun returnValue(): Int = 42
fun 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 можно сделать так
}
Использование break and continue внутри 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 при открытии большого проекта). Также на рисунке ниже показано время срабатывания автодополнения (которое уменьшилось по сравнению с предыдущими релизами)
-
И многие другие, которые напрямую связаны с созданием нового компилятора.