Что нового в Kotlin 1.7.20-RC
Дата выхода: 8 сентября 2022 года
Вышел релиз Kotlin 1.7.20-RC! Вот некоторые ключевые моменты этого предварительного релиза Kotlin:
Мы представили предварительный просмотр оператора
..<для создания открытых диапазоновМы представили новую экспериментальную функцию для JVM: inline-классы с общим базовым типом
Поддержка плагинов компилятора Kotlin K2
Команда Kotlin продолжает стабилизировать компилятор K2. K2 всё ещё находится в стадии Alpha (как было объявлено в релизе Kotlin 1.7.0), но теперь поддерживает несколько плагинов компилятора. Вы можете следить за этой задачей в YouTrack, чтобы получать обновления от команды Kotlin о новом компиляторе.
Начиная с этого предварительного релиза, компилятор Kotlin K2 поддерживает следующие плагины:
Parcelize
AtomicFU
jvm-abi-gen
Узнайте больше о новом компиляторе и его преимуществах в следующих видео:
Как включить компилятор Kotlin K2
Чтобы включить компилятор Kotlin K2 и протестировать его, используйте следующий параметр компилятора:
-Xuse-k2
Вы можете проверить повышение производительности в своих проектах JVM и сравнить результаты с результатами старого компилятора.
Оставьте свой отзыв о новом компиляторе K2
Мы очень ценим ваш отзыв в любой форме:
Направьте свой отзыв разработчикам K2 в Kotlin Slack: получить приглашение и присоединиться к каналу #k2-early-adopters
Сообщите о любых проблемах, с которыми вы столкнулись при использовании нового компилятора K2, на нашем портале отслеживания ошибок
Включить отправку статистических данных об использовании, чтобы разрешить JetBrains сбор анонимных данных об использовании K2
Предварительный просмотр оператора ..< для создания открытых диапазонов
В этом релизе представлен новый ..< оператор. Kotlin имеет оператор .. для выражения диапазона значений. Новый оператор ..< действует как функция until, и помогает определять открытый диапазон.
Наши исследования показывают, что этот новый оператор лучше выражает открытые диапазоны и чётко показывает, что верхняя граница не включена.
Вот пример использования оператора ..< в выражении when:
when (value) {
in 0.0..<0.25 -> // first quarter
in 0.25..<0.5 -> // second quarter
in 0.5..<0.75 -> // third quarter
in 0.75..1.0 -> // last quarter <- note closed range here
}
Изменения API стандартной библиотеки
Следующие новые типы и операции будут представлены в пакетах kotlin.ranges в общей стандартной библиотеке Kotlin:
Новый интерфейс OpenEndRange
Новый интерфейс для представления открытых диапазонов очень похож на существующий интерфейс ClosedRange<T>:
interface OpenEndRange<T : Comparable<T>> {
// lower bound
val start: T
// upper bound, not included in the range
val endExclusive: T
operator fun contains(value: T): Boolean = value >= start && value < endExclusive
fun isEmpty(): Boolean = start >= endExclusive
}
Реализация OpenEndRange в существующих итерируемых диапазонах
В настоящее время, когда разработчику нужно получить диапазон с исключённой верхней границей, они используют функцию until, создающую закрытый итерируемый диапазон фактически с теми же значениями. Для того, чтобы эти диапазоны были приемлемыми в новой API, которая принимает OpenEndRange<T>, мы хотим реализовать этот интерфейс в существующих итерируемых диапазонах: IntRange, LongRange, CharRange, UIntRange, ULongRange. Таким образом, они будут реализовывать одновременно оба интерфейса ClosedRange<T> и OpenEndRange<T>.
class IntRange : IntProgression(...), ClosedRange<Int>, OpenEndRange<Int> {
override val start: Int
override val endInclusive: Int
override val endExclusive: Int
}
Операторы rangeUntil для стандартных типов
rangeUntil операторы будут предоставлены для тех же типов и их комбинаций, для которых в настоящее время определён оператор rangeTo. Для прототипирования мы предоставляем их как расширяющие функции, но для согласованности планируем сделать их членами позднее, перед стабилизацией API открытых диапазонов.
Как включить оператор ..<
Чтобы использовать оператор ..< или реализовать эту конвенцию оператора для собственных типов, необходимо включить опцию компилятора -XXLanguage:+RangeUntilOperator.
Новые элементы API, введённые для поддержки открытых диапазонов стандартных типов, требуют opt-in, как обычно для экспериментальной API стандартной библиотеки: @OptIn(ExperimentalStdlibApi::class). В качестве альтернативы, можно использовать опцию компилятора: -opt-in=kotlin.ExperimentalStdlibApi.
Новый менеджер памяти Kotlin/Native включён по умолчанию
Kotlin 1.7.20 поставляется с новым менеджером памяти Kotlin/Native, включённым по умолчанию. Этот релиз приносит дальнейшую стабильность и улучшения производительности, что позволяет нам перевести новый менеджер памяти в статус Бета.
Предыдущий менеджер памяти усложнял написание конкурентного и асинхронного кода, включая проблемы с реализацией библиотеки kotlinx.coroutines. Это препятствовало принятию Kotlin Multiplatform Mobile, поскольку ограничения в отношении конкурентности создавали проблемы с совместным использованием Kotlin-кода между платформами iOS и Android. Новый менеджер памяти, наконец, открывает путь к выпуску Kotlin Multiplatform Mobile в бета-версии.
Новый менеджер памяти также поддерживает кэш компилятора, что делает время компиляции сопоставимым с предыдущими выпусками. Более подробную информацию о преимуществах нового менеджера памяти см. в нашей оригинальной статье в блоге для предварительной версии. Более подробные технические детали можно найти в инструкциях по миграции на GitHub.
Настройка
Начиная с Kotlin 1.7.20, новый менеджер памяти используется по умолчанию. Дополнительной настройки не требуется.
Если вы уже включили его вручную, вы можете удалить опцию kotlin.native.binary.memoryModel=experimental из файла gradle.properties или binaryOptions["memoryModel"] = "experimental" файла build.gradle(.kts).
Если необходимо, вы можете вернуться к старому менеджеру памяти с помощью опции kotlin.native.binary.memoryModel=strict в вашем gradle.properties. Однако поддержка кэша компилятора для старого менеджера памяти больше недоступна, поэтому время компиляции может ухудшиться.
Замораживание
В новом менеджере памяти замораживание устарело. Не используйте его, если ваш код не должен работать со старым менеджером (где замораживание всё ещё требуется). Это может быть полезно для авторов библиотек, которым требуется поддерживать совместимость со старым менеджером памяти, или для разработчиков, которые хотят иметь резервный вариант, если возникнут проблемы с новым менеджером памяти.
В таких случаях вы можете временно поддерживать код для нового и старого менеджеров памяти. Чтобы игнорировать предупреждения об устаревании, выполните одно из следующих действий:
Отметьте использование устаревшего API аннотацией
@OptIn(FreezingIsDeprecated::class).Примените
languageSettings.optIn("kotlin.native.FreezingIsDeprecated")ко всем наборам Kotlin-исходников в Gradle.Передайте флаг компилятора
-opt-in=kotlin.native.FreezingIsDeprecated.
Вызов Kotlin-подвешенных функций из Swift/Objective-C
Новый менеджер памяти по-прежнему имеет ограничение на вызов Kotlin-функций suspend из Swift и Objective-C с потоков, отличных от главного, но вы можете снять его с помощью новой опции Gradle.
Это ограничение изначально было введено в старом менеджере памяти из-за случаев, когда код отправлял продолжение, которое должно было возобновиться в исходном потоке. Если в этом потоке не было поддерживаемой очереди событий, задача никогда не выполнялась, а сопрограмма никогда не возобновлялась.
В некоторых случаях это ограничение больше не требуется, но проверка всех необходимых условий не может быть легко реализована. Поэтому мы решили сохранить его в новом менеджере памяти, добавив возможность его отключения. Для этого добавьте следующую опцию в свой gradle.properties.
kotlin.native.binary.objcExportSuspendFunctionLaunchThreadRestriction=none
Команда Kotlin выражает огромную благодарность Ахмеду Эль-Хелви за реализацию этой опции.
Оставьте свой отзыв
Это существенное изменение в нашей экосистеме. Мы ценим ваш отзыв, чтобы сделать её ещё лучше.
Попробуйте новый менеджер памяти в своих проектах и поделитесь отзывами на нашей платформе отслеживания ошибок YouTrack.
Обобщённые встроенные классы
Kotlin 1.7.20-RC позволяет базовому типу JVM встроенных классов быть параметром типа. Компилятор сопоставляет его с Any? или, в общем случае, с верхним пределом параметра типа.
Рассмотрим следующий пример:
@JvmInline
value class UserId<T>(val value: T)
fun compute(s: UserId<String>) {} // compiler generates fun compute-<hashcode>(s: Any?)
Функция принимает встроенный класс в качестве параметра. Параметр сопоставляется с верхним пределом, а не с аргументом типа.
Чтобы включить эту функцию, используйте опцию компилятора -language-version 1.8.
Поддержка Gradle 7.1
Kotlin 1.7.20-RC исправляет использование устаревших методов и свойств в Gradle 7.1, что устраняет предупреждения об устаревании, введённые в этом выпуске Gradle.
Обратите внимание на потенциальное изменение — org.jetbrains.kotlin.gradle.dsl.SingleTargetExtension теперь имеет параметр типа SingleTargetExtension<T : KotlinTarget>.
Если у вас есть многоплатформенные проекты, обратите внимание на следующие изменения:
Конвенция
kotlin.targets.fromPreset()устарела. Вместо этого вы всё ещё можете использовать подходkotlin.targets { fromPreset() }, но мы рекомендуем использовать более специализированные способы создания целей.Автоматически генерируемые Gradle-доступы к целевым объектам больше недоступны внутри блока
kotlin.targets { }. Используйте вместо этого методfindByName("targetName"). Обратите внимание, что такие доступы всё ещё доступны в случаеkotlin.targets, напримерkotlin.targets.linuxX64.
Как обновить до Kotlin 1.7.20-RC
Поддержка в IDE для Kotlin 1.7.20-RC доступна в IntelliJ IDEA 2022.2.1, Android Studio Dolphin (2021.3.1) и Android Studio Electric Eel (2022.1.1).
Вы можете установить Kotlin 1.7.20-RC следующими способами:
Если вы используете канал обновления Предварительных версий доступу, IDE автоматически предложит обновить до 1.7.20-RC, как только это станет доступно.
Если вы используете канал обновления Стабильный, вы можете изменить канал на Предварительные версии доступу в любое время, выбрав Инструменты | Kotlin | Настроить обновления плагина Kotlin в вашей IDE. После этого вы сможете установить последнюю предварительную версию. Подробные инструкции см. здесь.
После установки 1.7.20-RC не забудьте изменить версию Kotlin на 1.7.20-RC в ваших скриптах сборки.
© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/whatsnew-eap.html