Spec-Zone.ru › Kotlin 2

Что нового в Kotlin 1.5.20

Выпуск: 24 июня 2021 г.

В Kotlin 1.5.20 исправлены проблемы, обнаруженные в новых функциях версии 1.5.0, а также внесены различные улучшения инструментов.

Обзор изменений представлен в публикации о выпуске и в этом видео:

Информацию о цикле выпусков Kotlin см. в разделе Процесс выпуска Kotlin.

Kotlin/JVM

В Kotlin 1.5.20 для платформы JVM доступны следующие обновления:

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

  • Поддержка аннотаций допустимости null из JSpecify

  • Поддержка вызова сгенерированных Lombok методов Java в модулях с кодом на Kotlin и Java

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

В Kotlin 1.5.20 конкатенация строк для целевых платформ JVM 9+ компилируется в динамические вызовы (invokedynamic), что позволяет идти в ногу с современными версиями Java. Точнее, для конкатенации строк используется StringConcatFactory.makeConcatWithConstants().

Чтобы вернуться к конкатенации с помощью StringBuilder.append(), которая использовалась в предыдущих версиях, добавьте параметр компилятора -Xstring-concat=inline.

Узнайте, как добавлять параметры компилятора в Gradle, Maven и компиляторе командной строки.

Поддержка аннотаций допустимости null из JSpecify

Компилятор Kotlin может считывать различные типы аннотаций допустимости null, чтобы передавать информацию о допустимости null из Java в Kotlin. В версии 1.5.20 добавлена поддержка проекта JSpecify, в котором представлен стандартный унифицированный набор Java-аннотаций допустимости null.

С помощью JSpecify можно предоставлять более подробную информацию о допустимости null, чтобы Kotlin мог обеспечивать безопасность при взаимодействии с Java. Можно задать допустимость null по умолчанию для области объявления, пакета или модуля, указать параметрическую допустимость null и многое другое. Подробнее об этом см. в руководстве пользователя JSpecify.

Вот пример того, как Kotlin обрабатывает аннотации JSpecify:

// JavaClass.java
import org.jspecify.nullness.*;

@NullMarked
public class JavaClass {
  public String notNullableString() { return ""; }
  public @Nullable String nullableString() { return ""; }
}
// Test.kt
fun kotlinFun() = with(JavaClass()) {
  notNullableString().length // OK
  nullableString().length    // Warning: receiver nullability mismatch
}

В версии 1.5.20 все несовпадения допустимости null, выявленные на основе информации JSpecify, сообщаются как предупреждения. Чтобы включить строгий режим (с сообщениями об ошибках) при работе с JSpecify, используйте параметры компилятора -Xjspecify-annotations=strict и -Xtype-enhancement-improvements-strict-mode. Обратите внимание: проект JSpecify активно развивается. Его API и реализация могут значительно измениться в любой момент.

Подробнее о безопасности при работе с null и платформенных типах.

Поддержка вызова сгенерированных Lombok методов Java в модулях с кодом на Kotlin и Java

Плагин компилятора Lombok является экспериментальным. Его могут удалить или изменить в любой момент. Используйте его только для ознакомления. Будем благодарны за ваши отзывы о нем в YouTrack.

В Kotlin 1.5.20 добавлен экспериментальный плагин компилятора Lombok. Этот плагин позволяет генерировать и использовать объявления Java из Lombok в модулях с кодом на Kotlin и Java. Аннотации Lombok работают только в исходных файлах Java и игнорируются, если использовать их в коде Kotlin.

Плагин поддерживает следующие аннотации:

  • @Getter, @Setter

  • @NoArgsConstructor, @RequiredArgsConstructor и @AllArgsConstructor

  • @Data

  • @With

  • @Value

Мы продолжаем работу над этим плагином. Чтобы узнать о его текущем состоянии подробнее, посетите README плагина компилятора Lombok.

В настоящее время мы не планируем поддерживать аннотацию @Builder. Однако мы можем рассмотреть такую возможность, если вы проголосуете за @Builder в YouTrack.

Узнайте, как настроить плагин компилятора Lombok.

Kotlin/Native

В Kotlin/Native 1.5.20 доступны предварительная версия новой функции и улучшения инструментов:

  • Экспорт комментариев KDoc в сгенерированные заголовочные файлы Objective-C с явным включением

  • Исправления ошибок компилятора

  • Повышение производительности Array.copyInto() при копировании внутри одного массива

Экспорт комментариев KDoc в сгенерированные заголовочные файлы Objective-C с явным включением

Возможность экспорта комментариев KDoc в сгенерированные заголовочные файлы Objective-C является экспериментальной. Ее могут удалить или изменить в любой момент. Для ее использования требуется явное включение (см. подробности ниже); использовать ее следует только для ознакомления. Будем благодарны за ваши отзывы о ней в YouTrack.

Теперь можно настроить компилятор Kotlin/Native так, чтобы он экспортировал комментарии документации (KDoc) из кода Kotlin в создаваемые на его основе фреймворки Objective-C, делая их доступными пользователям этих фреймворков.

Например, следующий код Kotlin с KDoc:

/**
 * Prints the sum of the arguments.
 * Properly handles the case when the sum doesn't fit in 32-bit integer.
 */
fun printSum(a: Int, b: Int) = println(a.toLong() + b)

создает следующие заголовочные файлы Objective-C:

/**
 * Prints the sum of the arguments.
 * Properly handles the case when the sum doesn't fit in 32-bit integer.
 */
+ (void)printSumA:(int32_t)a b:(int32_t)b __attribute__((swift_name("printSum(a:b:)")));

Это также хорошо работает со Swift.

Чтобы опробовать экспорт комментариев KDoc в заголовочные файлы Objective-C, используйте параметр компилятора -Xexport-kdoc. Добавьте следующие строки в build.gradle(.kts) проектов Gradle, комментарии из которых нужно экспортировать:

kotlin {
    targets.withType<org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget> {
        compilations.get("main").kotlinOptions.freeCompilerArgs += "-Xexport-kdoc"
    }
}
kotlin {
    targets.withType(org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget) {
        compilations.get("main").kotlinOptions.freeCompilerArgs += "-Xexport-kdoc"
    }
}

Будем очень признательны, если вы поделитесь с нами отзывами в этом запросе YouTrack.

Исправления ошибок компилятора

В Kotlin/Native 1.5.20 исправлено множество ошибок компилятора. Полный список можно найти в списке изменений.

Одно важное исправление ошибки влияет на совместимость: в предыдущих версиях строковые константы, содержащие некорректные UTF суррогатные пары, теряли свои значения при компиляции. Теперь такие значения сохраняются. Разработчики приложений могут безопасно перейти на версию 1.5.20 — ничего не сломается. Однако библиотеки, скомпилированные с помощью версии 1.5.20, несовместимы с более ранними версиями компилятора. Подробности см. в этой задаче YouTrack.

Повышение производительности Array.copyInto() при копировании внутри одного массива

Мы улучшили работу Array.copyInto() в случае, когда исходный и целевой массивы совпадают. Благодаря оптимизации управления памятью для этого сценария такие операции теперь выполняются до 20 раз быстрее (в зависимости от количества копируемых объектов).

Kotlin/JS

В версии 1.5.20 мы публикуем руководство, которое поможет перенести проекты на новый бэкенд на основе IR для Kotlin/JS.

Руководство по переносу на бэкенд JS IR

В новом руководстве по переносу на бэкенд JS IR описаны проблемы, с которыми можно столкнуться при переносе, и способы их решения. Если вы обнаружите проблемы, которые не рассмотрены в руководстве, сообщите о них в нашем трекере задач.

Gradle

В Kotlin 1.5.20 появились следующие функции, которые могут улучшить работу с Gradle:

  • Кэширование загрузчиков классов процессоров аннотаций в kapt

  • Устаревание свойства сборки kotlin.parallel.tasks.in.project

Кэширование загрузчиков классов процессоров аннотаций в kapt

Кэширование загрузчиков классов процессоров аннотаций в kapt является экспериментальным. Его могут удалить или изменить в любой момент. Используйте его только для ознакомления. Будем благодарны за ваши отзывы о нем в YouTrack.

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

Чтобы включить эту функцию, укажите следующие свойства в файле gradle.properties:

# positive value will enable caching
# use the same value as the number of modules that use kapt
kapt.classloaders.cache.size=5

# disable for caching to work
kapt.include.compile.classpath=false

Подробнее о kapt.

Устаревание свойства сборки kotlin.parallel.tasks.in.project

Начиная с этого выпуска, параллельная компиляция Kotlin управляется флагом параллельного выполнения Gradle --parallel. При использовании этого флага Gradle выполняет задачи параллельно, ускоряя компиляцию и эффективнее используя ресурсы.

Свойство kotlin.parallel.tasks.in.project больше не требуется. Оно устарело и будет удалено в следующем крупном выпуске.

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

В Kotlin 1.5.20 изменены платформенные реализации нескольких функций для работы с символами, что позволило унифицировать их работу на разных платформах:

  • Поддержка всех цифр Unicode в Char.digitToInt() для Kotlin/Native и Kotlin/JS.

  • Унификация реализаций Char.isLowerCase()/isUpperCase() на разных платформах.

Поддержка всех цифр Unicode в Char.digitToInt() в Kotlin/Native и Kotlin/JS

Char.digitToInt() возвращает числовое значение десятичной цифры, представленной символом. До версии 1.5.20 функция поддерживала все символы-цифры Unicode только в Kotlin/JVM: реализации для платформ Native и JS поддерживали только цифры ASCII.

Теперь в Kotlin/Native и Kotlin/JS можно вызвать Char.digitToInt() для любого символа-цифры Unicode и получить его числовое представление.

fun main() {
//sampleStart
    val ten = '\u0661'.digitToInt() + '\u0039'.digitToInt() // ARABIC-INDIC DIGIT ONE + DIGIT NINE
    println(ten)
//sampleEnd
}

Унификация реализаций Char.isLowerCase()/isUpperCase() на разных платформах

Функции Char.isUpperCase() и Char.isLowerCase() возвращают логическое значение в зависимости от регистра символа. В Kotlin/JVM реализация проверяет как General_Category, так и свойства Unicode Other_Uppercase/Other_Lowercase, относящиеся к Unicode.

До версии 1.5.20 реализации для других платформ работали иначе и учитывали только общую категорию символа. В версии 1.5.20 реализации унифицированы на разных платформах и используют оба свойства для определения регистра символа:

fun main() {
//sampleStart
    val latinCapitalA = 'A' // has "Lu" general category
    val circledLatinCapitalA = 'Ⓐ' // has "Other_Uppercase" property
    println(latinCapitalA.isUpperCase() && circledLatinCapitalA.isUpperCase())
//sampleEnd
}
16 апреля 2026 г.
Что нового в Kotlin 1.5.30Что нового в Kotlin 1.5.0

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

Spec-Zone.ru

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