Вийшов Kotlin 2.3.0: що цікавого в оновленні

💡 Усі статті, обговорення, новини про Mobile — в одному місці. Приєднуйтесь до Mobile спільноти!

JetBrains представила нову стабільну версію мови програмування Kotlin — 2.3.0. У релізі зосередилися на розвитку мовних можливостей і інструментів, з’явилися експериментальні механізми перевірки значень, покращена взаємодія зі Swift, оновлений синтаксис для роботи з резервними полями та розширена підтримка Java.

Головні зміни

Перевірка невикористаних значень повернення

У Kotlin 2.3.0 зʼявився новий механізм, який допомагає ловити ситуації, коли результат виклику функції має значення, але випадково ігнорується. Компилятор попереджає, якщо вираз повертає щось, відмінне від Unit або Nothing, і це значення ніде не використовується.

Типовий приклад проблеми:

fun formatGreeting(name: String): String {
    if (name.isBlank()) return "Hello, anonymous user!"
    if (!name.contains(' ')) {

        "Hello, " + name.replaceFirstChar(Char::titlecase) + "!"
    }
    val (first, last) = name.split(' ')
    return "Hello, $first! Or should I call you Dr. $last?"
}

Раніше такий код компілювався без жодних сигналів. Тепер компілятор може попередити про ігнорований результат.

Функція експериментальна й вмикається явно:

kotlin {
    compilerOptions {
        freeCompilerArgs.add("-Xreturn-value-checker=check")
    }
}

Ви також можете керувати областю перевірки через анотації:

@MustUseReturnValues
class Greeter {
    fun greet(name: String): String = "Hello, $name"
}

Або навпаки явно дозволити ігнорування результату:

@IgnorableReturnValue
fun <T> MutableList<T>.addAndIgnoreResult(element: T): Boolean {
    return add(element)
}

Явні backing fields для властивостей

Kotlin 2.3.0 вводить новий синтаксис — explicit backing fields. Він вирішує класичну проблему, коли внутрішній тип властивості відрізняється від типу, який ви віддаєте назовні.

Раніше це виглядало так:

private val _city = MutableStateFlow<String>("")
val city: StateFlow<String> get() = _city

Тепер можна описати поле прямо всередині властивості:

val city: StateFlow<String>
    field = MutableStateFlow("")

Бонусом компілятор автоматично робить smart cast до типу backing field у межах приватної області видимості. Менше бойлерплейту, менше допоміжних приватних змінних.

Функція поки що експериментальна:

kotlin {
    compilerOptions {
        freeCompilerArgs.add("-Xexplicit-backing-fields")
    }
}

Повні імена класів і менші бандли

Для Kotlin/Wasm одразу дві важливі речі.

По-перше, KClass.qualifiedName тепер увімкнено за замовчуванням. Раніше у runtime був доступний лише короткий клас без пакета, що ламало код, портований з JVM.

По-друге, компілятор тепер зберігає рядки з символами Latin‑1 у UTF‑8, а не UTF‑16.

За вимірами JetBrains в результаті маємо до 13% менші Wasm-бандли та до 8% менші бандли навіть з увімкненими повними іменами класів.

Усе це працює автоматично, без додаткових прапорців.

Простіший експорт у JavaScript

У Kotlin/JS одразу кілька змін, які спрощують життя при інтеграції з JS та TypeScript.

Експорт suspend-функцій тепер можливий напряму:

@JsExport
open class Foo {
    suspend fun foo() = "Foo"
}

У JavaScript це споживається як звичайна async-функція. Раніше для цього доводилося писати ручні обгортки.

Також уніфіковано доступ до companion object в інтерфейсах:

@JsExport
interface Foo {
    companion object {
        fun bar() = "OK"
    }
}

Тепер у будь-якій модульній системі:

Foo.Companion.bar()

Без різних варіантів для ES modules і CommonJS.

Окремо варто згадати за підтримку BigInt64Array для LongArray.

Краща інтеграція зі Swift та швидші збірки

Kotlin 2.3.0 покращує Swift export. Тепер enum-класи Kotlin тепер експортуються як нативні Swift enum, а vararg-функції напряму мапляться на варіативні параметри Swift.

Приклад enum:

enum class Color(val rgb: Int) {
    RED(0xFF0000),
    GREEN(0x00FF00),
    BLUE(0x0000FF)
}

У Swift це виглядає як повноцінний enum без зайвих обгорток.

Окрім цього, релізні збірки стали швидшими — до 40% швидше для деяких iOS-мультиплатформених проєктів.

Інші покращення

  • Kotlin/JVM тепер може генерувати байткод для Java 25.
  • Додано корисні stack trace для мінімізованих Android-додатків через R8.
  • Забезпечено повну сумісність із Gradle 9.0 та представлено новий API для реєстрації згенерованих сорсів.
  • API kotlin.time.Clock і Instant переведено у стабільний статус.
  • Додано функції parseOrNull, генерацію UUID версій v4 і v7, а також можливість створювати v7 для конкретних таймстемпів.
  • Підвищено мінімальні версії iOS, tvOS і watchOS, а підтримка x86_64-таргетів поступово згортається.
👍ПодобаєтьсяСподобалось5
До обраногоВ обраному1
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Підписатись на коментарі