Spec-Zone.ru › Kotlin 1.9

Что нового в 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 в инлайновых и данных классах.

  • Шаблоны строк, за исключением тех, которые имеют один неконстантный аргумент (см. 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.

Для решения этой проблемы, 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.

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

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

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

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

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

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

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

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

END_OF_DOCUMENT_MARKER ```

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 Pod, вы также должны указать её в 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.

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

© 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