Сегодня я решил написать о самых главных нововведениях в Kotlin 1.4.0. Думаю, что начинающим Android разработчикам будет очень интересна данная тема и они смогут применить новые фишки в своих приложениях. Также, я надеюсь, что моя статья будет полезна и для профессиональных разработчиков, которые очень любят и помогают развивать Kotlin.
Основные темы, которые я затрону:
Нововведения в синтаксисе
Новые инструменты в IDE
Новые компилятор
Качество и производительность
Ну что ж, предлагаю вам налить себе кофе или чай, запастись сладеньким и можно начинать)
На момент написания статьи самыми новыми релизами были:
Релиз |
Дата и краткое описание |
|
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 – 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 для отслеживания нажатия на элемент списка.
Данный подход сокращает количество строк кода и вводит дополнительные удобства.
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 можно сделать так
}
В 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)
}
}
}
Теперь вы можете создавать и конфигурировать различные типы проектов 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 при открытии большого проекта). Также на рисунке ниже показано время срабатывания автодополнения (которое уменьшилось по сравнению с предыдущими релизами)
И многие другие, которые напрямую связаны с созданием нового компилятора.
OpenAI готовится запустить собственную поисковую систему на базе ChatGPT. Информацию об этом публикуют западные издания. Ожидается, что новый поисковик может…
Центр управления связью общего пользования (ЦМУ ССОП) Роскомнадзора рекомендовал компаниям из реестра провайдеров ограничить доступ поисковых ботов к информации на российских сайтах.…
Apple возобновила переговоры с OpenAI о возможности внедрения ИИ-технологий в iOS 18, на основе данной операционной системы будут работать новые…
Конкурсный управляющий российской «дочки» Google подготовил 23 иска к участникам рекламного рынка. Общая сумма исков составляет 16 млрд рублей –…
Google завершил обновление основного алгоритма March 2024 Core Update. Раскатка обновлений была завершена 19 апреля, но сообщил об этом поисковик…
У частных продавцов на Авито появилась возможность составлять текст объявлений с помощью нейросети. Новый функционал доступен в категории «Обувь, одежда,…