Spec-Zone.ru › Kotlin 1.8

Что нового в Kotlin 1.4.20

Дата выхода: 23 ноября 2020 года

Kotlin 1.4.20 предлагает ряд новых экспериментальных функций, а также исправления и улучшения для существующих функций, включая те, что были добавлены в 1.4.0.

Вы также можете узнать о новых функциях с более подробными примерами в этой статье в блоге.

Kotlin/JVM

Улучшения Kotlin/JVM направлены на соответствие возможностям современных версий Java:

  • Целевое окружение Java 15

  • Конкатенация строк с помощью invokedynamic

Целевое окружение Java 15

Теперь Java 15 доступна в качестве целевого окружения для Kotlin/JVM.

Конкатенация строк с помощью invokedynamic

invokedynamic конкатенация строк является Экспериментальной. Она может быть удалена или изменена в любое время. Требуется включение (см. подробности ниже). Используйте ее только для оценки. Мы ценим ваш отзыв на нее в YouTrack.

Kotlin 1.4.20 может компилировать конкатенацию строк в динамические вызовы на JVM 9+ целевых платформах, что улучшает производительность.

В настоящее время эта функция экспериментальная и охватывает следующие случаи:

  • String.plus в операторной (a + b), явной (a.plus(b)) и ссылочной ((a::plus)(b)) формах.

  • toString в инлайновых и data-классах.

  • шаблоны строк, за исключением тех, которые содержат один неконстантный аргумент (см. KT-42457).

Чтобы включить invokedynamic конкатенацию строк, добавьте -Xstring-concat опцию компилятора со следующими значениями:

  • indy-with-constants для выполнения invokedynamic конкатенации строк с StringConcatFactory.makeConcatWithConstants().

  • indy для выполнения invokedynamic конкатенации строк с StringConcatFactory.makeConcat().

  • inline чтобы вернуться к классической конкатенации с помощью StringBuilder.append().

Kotlin/JS

Kotlin/JS быстро развивается, и в версии 1.4.20 вы найдёте ряд экспериментальных функций и улучшений:

  • Изменения в Gradle DSL

  • Новые шаблоны мастера

  • Игнорирование ошибок компиляции с помощью компилятора IR

Изменения в Gradle DSL

Gradle DSL для Kotlin/JS получает ряд обновлений, которые упрощают настройку и кастомизацию проекта. Это включает в себя изменения конфигурации webpack, модификации автоматически сгенерированного файла package.json, и улучшенный контроль над транзитивными зависимостями.

Единая точка для конфигурации webpack

Для целевой платформы браузер доступен новый блок конфигурации commonWebpackConfig. Внутри него вы можете настроить общие настройки из одной точки, вместо дублирования конфигураций для webpackTask, runTask, и testTask.

Чтобы включить поддержку CSS по умолчанию для всех трёх задач, добавьте следующий фрагмент в build.gradle(.kts) вашего проекта:

browser {
    commonWebpackConfig {
        cssSupport.enabled = true
    }
    binaries.executable()
}

Узнайте больше о настройке webpack сборки.

Настройка package.json из Gradle

Для большего контроля над управлением пакетами и распространением Kotlin/JS, теперь вы можете добавлять свойства в файл проекта package.json через Gradle DSL.

Чтобы добавить пользовательские поля в ваш package.json, используйте функцию customField в блоке packageJson компиляции:

kotlin {
    js(BOTH) {
        compilations["main"].packageJson {
            customField("hello", mapOf("one" to 1, "two" to 2))
        }
    }
}

Узнайте больше о package.json настройке.

Селективные разрешения зависимостей Yarn

Поддержка селективных разрешений зависимостей Yarn находится в экспериментальной стадии. Она может быть удалена или изменена в любое время. Используйте только для оценки. Мы ценим ваш отзыв об этом на YouTrack.

Kotlin 1.4.20 предоставляет возможность настройки селективных разрешений зависимостей Yarn — механизма переопределения зависимостей пакетов, от которых вы зависите. Подробнее

Вы можете использовать его через YarnRootExtension внутри YarnPlugin в Gradle. Чтобы повлиять на разрешённую версию пакета для вашего проекта, используйте функцию resolution, передавая селектор имени пакета (как указано в Yarn) и версию, к которой он должен быть разрешен.

rootProject.plugins.withType<YarnPlugin> {
    rootProject.the<YarnRootExtension>().apply {
        resolution("react", "16.0.0")
        resolution("processor/decamelize", "3.0.0")
    }
}

Здесь, все ваши npm-зависимости, требующие react, получат версию 16.0.0, а processor получит свою зависимость decamelize как версию 3.0.0.

Отключение гранулированных рабочих пространств

Отключение гранулированных рабочих пространств находится в экспериментальной стадии. Она может быть удалена или изменена в любое время. Используйте только для оценки. Мы ценим ваш отзыв об этом на YouTrack.

Для ускорения времени сборки плагин Kotlin/JS Gradle устанавливает только зависимости, необходимые для конкретной задачи Gradle. Например, пакет webpack-dev-server устанавливается только при выполнении одной из задач *Run, а не при выполнении задачи assemble. Такое поведение может потенциально создавать проблемы при одновременном запуске нескольких процессов Gradle. При конфликте требований зависимостей два разных экземпляра npm-пакетов могут вызывать ошибки.

Для решения этой проблемы Kotlin 1.4.20 включает возможность отключения так называемых гранулированных рабочих пространств. Эта функция в данный момент доступна через YarnRootExtension внутри YarnPlugin в Gradle. Чтобы использовать её, добавьте следующий фрагмент в ваш build.gradle.kts файл:

rootProject.plugins.withType<YarnPlugin> {
    rootProject.the<YarnRootExtension>().disableGranularWorkspaces()
}

Новые шаблоны мастера

Чтобы предоставить вам более удобные способы кастомизации проекта во время создания, мастер создания проекта Kotlin поставляется с новыми шаблонами для приложений Kotlin/JS:

  • Приложение для браузера — минимальный проект Kotlin/JS Gradle, который работает в браузере.

  • Приложение React — приложение React, использующее соответствующий kotlin-wrappers. Оно предоставляет параметры для включения интеграций с таблицами стилей, компонентами навигации или контейнерами состояния.

  • Приложение Node.js — минимальный проект для выполнения в среде выполнения Node.js. Он поставляется с возможностью непосредственного включения экспериментального пакета kotlinx-nodejs.

Узнайте, как создать приложения Kotlin/JS из шаблонов.

Игнорирование ошибок компиляции с помощью компилятора IR

Режим игнорирования ошибок компиляции находится в экспериментальной стадии. Он может быть удалён или изменён в любое время. Требуется включение (см. подробности ниже). Используйте только для оценки. Мы ценим ваш отзыв об этом на YouTrack.

Компилятор IR для Kotlin/JS поставляется с новым экспериментальным режимом — компиляция с ошибками. В этом режиме вы можете запускать свой код, даже если он содержит ошибки, например, если вы хотите попробовать определённые вещи, пока всё приложение ещё не готово.

Для этого режима существуют две политики толерантности:

  • SEMANTIC: компилятор примет код, который синтаксически корректен, но не имеет смысла семантически, например, val x: String = 3.

  • SYNTAX: компилятор примет любой код, даже если он содержит синтаксические ошибки.

Чтобы разрешить компиляцию с ошибками, добавьте опцию компилятора -Xerror-tolerance-policy= со значениями, указанными выше.

Узнайте больше о игнорировании ошибок компиляции с помощью компилятора Kotlin/JS IR.

Kotlin/Native

Приоритетами Kotlin/Native в версии 1.4.20 являются производительность и доработка существующих функций. Вот заметные улучшения:

  • Анализ утечек

  • Улучшения производительности и исправление ошибок

  • Включение обертывания исключений Objective-C

  • Улучшения плагина CocoaPods

  • Поддержка библиотек Xcode 12

Анализ утечек

Механизм анализа утечек находится на стадии экспериментальной разработки. Он может быть удален или изменен в любое время. Используйте его только для оценки. Мы ценим ваши отзывы на YouTrack.

Kotlin/Native получает прототип нового механизма анализа утечек. Он улучшает производительность во время выполнения, размещая определенные объекты в стеке вместо кучи. Этот механизм показал среднее увеличение производительности на 10% по нашим тестам, и мы продолжаем улучшать его, чтобы ускорить программу еще больше.

Анализ утечек выполняется на отдельной стадии компиляции для релизных сборок (с опцией компилятора -opt).

Если вы хотите отключить стадию анализа утечек, используйте опцию компилятора -Xdisable-phases=EscapeAnalysis.

Улучшения производительности и исправление ошибок

Kotlin/Native получает улучшения производительности и исправления ошибок в различных компонентах, включая те, что были добавлены в версии 1.4.0, например, механизм обмена кодом.

Включение обертывания исключений Objective-C

Механизм обертывания исключений Objective-C находится на стадии экспериментальной разработки. Он может быть удален или изменен в любое время. Требуется включение (см. подробности ниже). Используйте его только для оценки. Мы ценим ваши отзывы на YouTrack.

Kotlin/Native теперь может обрабатывать исключения, сгенерированные кодом Objective-C во время выполнения, чтобы избежать аварий программы.

Вы можете включить обертывание NSException в Kotlin-исключения типа ForeignException. Они содержат ссылки на исходные NSException . Это позволяет получить информацию о корневой причине и обработать её должным образом.

Для включения обертывания исключений Objective-C укажите опцию -Xforeign-exception-mode objc-wrap в вызове cinterop или добавьте свойство foreignExceptionMode = objc-wrap в файл .def. Если вы используете интеграцию CocoaPods, укажите опцию в блоке задания сборки pod {} зависимости, как показано ниже:

pod("foo") {
    extraOpts = listOf("-Xforeign-exception-mode", "objc-wrap")
}

По умолчанию поведение остается прежним: программа завершается при возникновении исключения из кода Objective-C.

Улучшения плагина CocoaPods

Kotlin 1.4.20 продолжает серию улучшений интеграции с CocoaPods. Теперь вы можете опробовать следующие новые возможности:

  • Улучшенное выполнение задач

  • Расширенный DSL

  • Обновлённая интеграция с Xcode

Улучшенное выполнение задач

Плагин CocoaPods получил улучшенный поток выполнения задач. Например, при добавлении новой зависимости CocoaPods существующие зависимости не перестраиваются. Добавление дополнительного целевого объекта также не влияет на перестройку зависимостей для существующих.

Расширенный DSL

DSL для добавления зависимостей CocoaPods в ваш Kotlin-проект получил новые возможности.

Помимо локальных Pods и Pods из репозитория CocoaPods, вы можете добавить зависимости следующих типов библиотек:

  • Библиотека из пользовательского репозитория спецификаций.

  • Удаленная библиотека из репозитория Git.

  • Библиотека из архива (также доступна по произвольному HTTP-адресу).

  • Статическая библиотека.

  • Библиотека с пользовательскими опциями cinterop.

Узнайте больше о добавлении зависимостей CocoaPods в проекты Kotlin. Найдите примеры в примере Kotlin с CocoaPods.

Обновлённая интеграция с Xcode

Для правильной работы с Xcode Kotlin требует некоторых изменений в Podfile:

  • Если у вашего Kotlin Pod есть какие-либо зависимости Git, HTTP или specRepo, вы также должны указать их в Podfile.

  • При добавлении библиотеки из пользовательской спецификации, вы также должны указать местоположение спецификаций в начале вашего Podfile.

Теперь ошибки интеграции имеют подробное описание в IDEA. Таким образом, при возникновении проблем с Podfile, вы сразу узнаете, как их исправить.

Узнайте больше о создании Kotlin-pods.

Поддержка библиотек Xcode 12

Мы добавили поддержку новых библиотек, поставляемых с Xcode 12. Теперь вы можете использовать их из Kotlin-кода.

Kotlin Multiplatform

Изменённая структура публикации многоплатформенных библиотек

Начиная с Kotlin 1.4.20, отдельной публикации метаданных больше нет. Метаданные теперь включены в публикацию корня, которая представляет всю библиотеку и автоматически разрешается в соответствующие платформенно-специфичные артефакты, когда добавляется в качестве зависимости к общему набору исходных кодов.

Узнайте больше о публикации многоплатформенной библиотеки.

Совместимость с предыдущими версиями

Это изменение структуры нарушает совместимость между проектами с иерархической структурой проекта. Если у многоплатформенного проекта и библиотеки, от которой он зависит, обе есть иерархическая структура проекта, то вам необходимо обновить их до Kotlin 1.4.20 или выше одновременно. Библиотеки, опубликованные с Kotlin 1.4.20, недоступны для использования из проектов, опубликованных с более ранними версиями.

Проекты и библиотеки без иерархической структуры проекта остаются совместимыми.

Стандартная библиотека

Стандартная библиотека Kotlin 1.4.20 предлагает новые расширения для работы с файлами и улучшенную производительность.

  • Расширения для java.nio.file.Path

  • Улучшенная производительность функции String.replace

Расширения для java.nio.file.Path

Расширения для java.nio.file.Path находятся на стадии экспериментальной разработки. Они могут быть удалены или изменены в любое время. Требуется включение (см. подробности ниже). Используйте их только для оценки. Мы ценим ваши отзывы на YouTrack.

Теперь стандартная библиотека предоставляет экспериментальные расширения для java.nio.file.Path. Работа с современным JVM-API файлов в стиле Kotlin теперь аналогична работе с java.io.File расширениями из пакета kotlin.io.

// construct path with the div (/) operator
val baseDir = Path("/base")
val subDir = baseDir / "subdirectory" 

// list files in a directory
val kotlinFiles: List<Path> = Path("/home/user").listDirectoryEntries("*.kt")

Расширения доступны в пакете kotlin.io.path в модуле kotlin-stdlib-jdk7. Для использования расширений, включите экспериментальную аннотацию @ExperimentalPathApi.

Улучшенная производительность функции String.replace

Новая реализация String.replace() ускоряет выполнение функции. Чувствительная к регистру версия использует ручной цикл замены, основанный на indexOf, в то время как нечувствительная к регистру использует сопоставление с помощью регулярных выражений.

END_OF_DOCUMENT_MARKER

Kotlin Android Extensions

В версии 1.4.20 плагин Kotlin Android Extensions устарел, а генератор реализации Parcelable перемещен в отдельный плагин.

  • Устаревание синтетических представлений

  • Новый плагин для генератора реализации Parcelable

Устаревание синтетических представлений

Синтетические представления были представлены в плагине Kotlin Android Extensions некоторое время назад, чтобы упростить взаимодействие с элементами пользовательского интерфейса и сократить код. Сейчас Google предлагает родной механизм, выполняющий ту же задачу — привязки представлений Android Jetpack's view bindings, и мы устареваем синтетические представления в пользу этих привязок.

Мы выносим генератор реализации Parcelable из kotlin-android-extensions и начинаем цикл устаревания для остальной его части — синтетических представлений. Пока они будут продолжать работать с предупреждением об устаревании. В будущем вам потребуется переключить свой проект на другое решение. Вот руководство, которое поможет вам мигрировать свой Android-проект со синтетики на привязки представлений.

Новый плагин для генератора реализации Parcelable

Генератор реализации Parcelable теперь доступен в новом плагине kotlin-parcelize. Используйте этот плагин вместо kotlin-android-extensions.

kotlin-parcelize и kotlin-android-extensions не могут быть применены вместе в одном модуле.

Аннотация @Parcelize перемещена в пакет kotlinx.parcelize.

Узнайте больше о генераторе реализации Parcelable в документации Android.

Последнее изменение: 10 января 2023 г.
Что нового в Kotlin 1.4.30 Что нового в Kotlin 1.4

© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/whatsnew1420.html

Spec-Zone.ru

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