Поиск по сайту:

Что нового в Котлин 1.6?


В Kotlin 1.6 появились новые функции, улучшенный экспериментальный менеджер памяти и расширенная стандартная библиотека. Эти дополнения помогают усовершенствовать все более популярный межплатформенный и междисциплинарный язык JetBrains.

Новый собственный диспетчер памяти

Возможно, самым большим изменением в экосистеме Kotlin является появление нового диспетчера памяти для Kotlin Native. Хотя он по-прежнему помечен как предварительная версия для разработчиков, обновленный менеджер отражает направление, в котором Kotlin пойдет в будущем.

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

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

Хотя новая система доступна в Kotlin 1.6, в настоящее время она не предназначена для промышленного использования. В некоторых ситуациях производительность может быть снижена до 5 раз по сравнению с устаревшим диспетчером памяти. Продолжаются усилия по разработке производительной версии, готовой для общего использования.

Запечатаны, когда заявления

Закрытые операторы when позволяют получать предупреждение компилятора, когда вы забываете обработать возможный случай. Если вы передаете запечатанный класс, логический тип или перечисление в when, вы, как правило, захотите выполнить явный курс действий для каждого возможного входного значения:

sealed class Drivetrain {
    data class Electric(val Power: Int) : Drivetrain()
    data class Diesel(val Power: Int) : Drivetrain()
    data class Hybrid(val Diesel: Drivetrain, val Electric: Drivetrain) : Drivetrain()
}
 
fun getTotalPowerKwh(drivetrain: DriveTrain) : Int {
    when (drivetrain) {
        is Drivetrain.Diesel -> drivetrain.Diesel.Power
        is Drivetrain.Electric -> drivetrain.Electric.Power
    }
}

В приведенном выше примере закрытый класс Drivetrain содержит три класса данных. Оператор when обрабатывает только два из них — если ваш код получает гибридную трансмиссию, будет возвращено неверное значение.

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

Приостановка преобразования типов

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

Это позволяет использовать следующий код:

fun createUser(name: String) {
    // ...
}
 
flow.collect(::createUser)
 
val createUserFunction = ::createUser
flow.collect(createUserFunction)

Этот код прерывался при втором вызове flow.collect(). Переменная createUserFunction относится к определению обычной функции, а не к приостановке, созданной при первом вызове. Kotlin теперь справится с этим, создав приостановленную версию, когда этого требует контекст получателя.

Приостанавливающие функции теперь также поддерживаются как супертипы. Это позволяет передавать классы, реализующие приостанавливающие функциональные типы, везде, где в настоящее время поддерживается ссылка на приостанавливающую функцию.

class ImplementsSuspendingFunctionalType : suspend () -> Unit {
    override suspend fun invoke() { /* ... */ }
}

Интерфейс suspend() -> Unit реализован так же, как вы уже можете использовать () -> Unit для не приостанавливающих типов.

Сканер покрытия кода

У Kotlin теперь есть официальный инструмент сканирования покрытия кода. Kover — это плагин Gradle, который собирает статистику покрытия тестов для Kotlin JVM, мультиплатформенных и смешанных проектов Java. Он может генерировать отчеты в форматах HTML и XML.

Kover обеспечивает полную совместимость с языком Kotlin и его набором инструментов Gradle. Хотя некоторые сторонние инструменты уже могут предоставлять оценки охвата, они существуют вне экосистемы и не всегда позволяют отслеживать каждую задачу. Kover предлагает полностью комплексный подход. Разработка продолжается, и этот первоначальный выпуск помечен как экспериментальный.

Чтобы включить Kover, добавьте следующие строки в файл сборки верхнего уровня:

plugins {
     id("org.jetbrains.kotlinx.kover") version "0.4.2"
}

Kover теперь будет работать как часть ваших сборок Gradle.

Дополнения стандартной библиотеки

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

readln() и readlnOrNull()

Эти две новые функции читают и возвращают строку из стандартного потока ввода. Первый вызовет исключение, если будет достигнута отметка EOF, а второй вернет null.

тип()

Функция typeOf() позволяет определить фактический тип материализованного типа, обычно выражаемый как T, во время выполнения.

inline fun <reified T> getTypeString() : String {
    val type = typeOf<T>()
    return type.toString()
}

Создатели коллекций

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

val fruits = listOf("apple", "banana");
val veg = listOf("carrot", "cabbage");
 
val groceries = buildList {
    add("milk")
    addAll(fruits)
    addAll(veg)
}
 
// ["milk", "apple", "banana", "carrot", "cabbage"]

Значения продолжительности

Класс Duration для представления значений времени стал стабильным. Он предоставляет интегрированный тип для хранения продолжительности периода времени в вашем коде. В классе есть методы, облегчающие преобразование между единицами измерения:

// Emits 1.0
println(60.toDuration(DurationUnit.SECONDS).inMinutes);

Дополнительные изменения стандартной библиотеки

Целые числа имеют новые функции rotateLeft() и rotateRight(). Они вращают двоичное представление числа на заданное количество бит в указанном направлении. Регулярные выражения получают функции разделения последовательности и согласованное поведение для replace() и replaceFirst() в средах Java и JavaScript.

Некоторые существующие функции устарели. Функции concat(), match() и matches() для строк, а также sort() для массивов теперь будет выдавать предупреждения. Их функционал уже перекрывается альтернативными вариантами.

Другие изменения

Kotlin 1.6 добавляет несколько улучшений экосистемы и улучшений качества жизни. Среди них поддержка Xcode 13 и возможность компилировать сборки Windows на любой платформе. Если вы нацелены на mingwX64 или mingwX86 для Windows, теперь вы можете компилировать из любой системы, которая поддерживает разработку Kotlin/Native.

Усовершенствования кэшей компилятора для сборок Linux и iOS позволили вдвое сократить типичное время сборки после первого запуска. Обновления цепочки зависимостей Kotlin значительно сокращают использование диска. Переход на LLVM 11.1 сократил версию macOS с 1200 МБ до примерно 300 МБ.

Если вы используете Kotlin JavaScript, теперь вы можете отключить автоматическую загрузку Node.js и Yarn в процессе сборки. Это полезно, когда вы компилируете код в предварительно сконфигурированной среде, где на хосте уже установлены эти зависимости.

Краткое содержание

Kotlin 1.6 — это здоровый выпуск с новыми экспериментальными функциями, прокладывающими путь вперед, и хорошим списком изменений языка и стандартной библиотеки, которые вы можете использовать уже сегодня. Также были улучшены возможности взаимодействия между разновидностями Kotlin, поэтому больше кода будет вести себя одинаково независимо от того, скомпилирован ли он для JVM, Native или JavaScript.

Веха 1.6 также означает, что сопровождающие Kotlin предлагают расширенный период поддержки для более старых версий API. Три предыдущие версии теперь будут поддерживаться в непрерывном режиме. Это означает, что в настоящее время вы можете разрабатывать версии Kotlin с 1.3 по 1.6, что дает вам больше времени для обновления между выпусками.

Вы можете перейти на Kotlin 1.6 уже сегодня, обновив свою версию IntelliJ IDEA, Android Studio, Xcode или компилятора Kotlin CLI. Стоит сначала просмотреть руководство по совместимости, чтобы убедиться, что вы устранили все ранее заявленные устаревания, которые будут вызывать предупреждения или ошибки в версии 1.6.




Все права защищены. © Linux-Console.net • 2019-2024