Вийшов Kotlin 2.3.0: що цікавого в оновленні
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-таргетів поступово згортається.
Немає коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів