Spec-Zone.ru › Kotlin 1.7

Что нового в Kotlin 1.7.20-RC

Дата выхода: 8 сентября 2022 года

Данный документ не охватывает все возможности выпуска Early Access Preview (EAP), а лишь выделяет новые и значительные улучшения. Полный список изменений см. в журнале изменений на GitHub.

Вышел релиз Kotlin 1.7.20-RC! Вот некоторые ключевые моменты этого предварительного релиза Kotlin:

  • Новый компилятор Kotlin K2 поддерживает all-open, SAM с приемником, Lombok, Parcelize и другие плагины компилятора

  • Мы представили предварительный просмотр оператора ..< для создания открытых диапазонов

  • Новый менеджер памяти Kotlin/Native включен по умолчанию

  • Мы представили новую экспериментальную функцию для JVM: inline-классы с общим базовым типом

  • Обновления плагина Kotlin Gradle для поддержки Gradle 7.1

Поддержка плагинов компилятора Kotlin K2

Команда Kotlin продолжает стабилизировать компилятор K2. K2 всё ещё находится в стадии Alpha (как было объявлено в релизе Kotlin 1.7.0), но теперь поддерживает несколько плагинов компилятора. Вы можете следить за этой задачей в YouTrack, чтобы получать обновления от команды Kotlin о новом компиляторе.

Начиная с этого предварительного релиза, компилятор Kotlin K2 поддерживает следующие плагины:

  • all-open

  • no-arg

  • SAM с приемником

  • Lombok

  • Parcelize

  • AtomicFU

  • jvm-abi-gen

Альфа-версия нового компилятора K2 работает только с проектами JVM. Она не поддерживает Kotlin/JS, Kotlin/Native или другие проекты с кроссплатформенной поддержкой.

Узнайте больше о новом компиляторе и его преимуществах в следующих видео:

  • Путь к новому компилятору Kotlin

  • Компилятор K2: Обзор сверху вниз

Как включить компилятор Kotlin K2

Чтобы включить компилятор Kotlin K2 и протестировать его, используйте следующий параметр компилятора:

-Xuse-k2

Вы можете проверить повышение производительности в своих проектах JVM и сравнить результаты с результатами старого компилятора.

Оставьте свой отзыв о новом компиляторе K2

Мы очень ценим ваш отзыв в любой форме:

  • Направьте свой отзыв разработчикам K2 в Kotlin Slack: получить приглашение и присоединиться к каналу #k2-early-adopters

  • Сообщите о любых проблемах, с которыми вы столкнулись при использовании нового компилятора K2, на нашем портале отслеживания ошибок

  • Включить отправку статистических данных об использовании, чтобы разрешить JetBrains сбор анонимных данных об использовании K2

Предварительный просмотр оператора ..< для создания открытых диапазонов

Новый оператор является экспериментальным и имеет ограниченную поддержку в IDE.

В этом релизе представлен новый ..< оператор. 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.

Подробнее о новом операторе в этом документе KEEP.

Новый менеджер памяти 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

Не добавляйте эту опцию, если вы используете версию native-mt kotlinx.coroutines или других библиотек, которые используют тот же подход «передача в исходный поток».

Команда Kotlin выражает огромную благодарность Ахмеду Эль-Хелви за реализацию этой опции.

Оставьте свой отзыв

Это существенное изменение в нашей экосистеме. Мы ценим ваш отзыв, чтобы сделать её ещё лучше.

Попробуйте новый менеджер памяти в своих проектах и поделитесь отзывами на нашей платформе отслеживания ошибок YouTrack.

Обобщённые встроенные классы

Обобщённые встроенные классы — это экспериментальная функция. Она может быть удалена или изменена в любое время. Требуется опциональное включение (см. подробности ниже), и вы должны использовать её только для оценочных целей. Мы будем рады вашему отзыву об этом на 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 в ваших скриптах сборки.

Последнее изменение: 27 сентября 2022

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API