Компилятор:
✅ JSpecify support (null-safety в интеропе с Java)
✅ K1 компилятор deprecated (K2 теперь основной)
✅ Kotlin/Wasm Beta
Мультиплатформа:
✅ CMS GC by default (производительность)
✅ KMP IDE plugin на Windows и Linux
✅ Compose for Web в Beta
✅ Compose Hot Reload в Stable
Инструменты:
✅ K2 mode вIDEA теперь основной режим
✅ Улучшение импортов (IDE работает быстрее)
✅ NPM publishing для JS/Wasm артефактов
✅ Улучшили опыт разработки под Kotlin/Wasm в IDEA
Экосистема:
✅ OpenAPI для Ktor
✅ WebRTC client в Ktor
✅ Exposed 1.0.0 (работа с БД)
✅ Поддержка R2DBC в Exposed
#Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25🔥10👎1🤔1
После долгих лет в experimental статусе, JetBrains планируют стабилизировать kotlinx.collections.immutable. Добавят новые типы (PersistentOrderedSet, PersistentHashSet), улучшат API, документацию. Может вовсе стоит их сделать частью stdlib ?
Это долгожданная новость. Но вот интересный вопрос: нужна ли она вообще сейчас?
Immutable collections были критичны для Compose, потому что помогали избежать рекомпозиций. Но потом пришел Strong Skipping Mode в Compose. И теперь Compose намного умнее в том, что перерисовывать и что нет. Нужна ли immutable collection для этого теперь? Я честно не знаю ответ. 🤷
Потому что вопрос к вам:
👉 Кто сейчас юзает immutable collections в Compose проектах? Зачем?
👉 Помогает ли это производительности, или это уже не нужно?
👉 Где вы их юзаете еще, кроме Compose?
👉 А может быть, наоборот, нужны еще больше?
#Kotlin #KotlinX #Compose
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23❤3🙏2👎1
JetBrains будет поддерживать новые версии Kotlin Stdlib на протяжении 18 месяцев. Это значит: если ты обновился на какую-то версию Kotlin — JetBrains гарантирует исправления уязвимостей и критические баги для этой версии. Потом можешь обновляться, когда будешь готов.
Кому это вообще нужно? Командам кто не гонится за новыми фичами и обновлениями. Новая версия выходит, а с ней баги или непредсказуемое поведение:
👉 Tooling не подтянулся
👉 Просто нет времени на большое обновление
👉 У вас внешние требования и надо всё перепроверять перед обновлением
Это как Java с LTS-версиями. Есть гарантии и предсказуемость, что важнее новых фичей.
#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23👎9👍5🤔2
Please open Telegram to view this post
VIEW IN TELEGRAM
👎86👍6🔥2
🤯 «Если работает — какая разница, что там внутри» — так думает любой менеджер. Посмотрите на свой стек: сколько там софта, на который вы постоянно жалуетесь? Я видел десятки приложений с сомнительными решениями, тяжёлой поддержкой и горами легаси, но ведь работает и деньги приносит. Смартфоны становятся мощнее и вытягивают это всё, а до бюджетников большинству разработчиков просто нет дела.
Я не оправдываю утверждение «писать говнокод — это нормально». Конечно нет! Но бизнесу, который за всё это платит, важно одно: чтобы работало и приносило деньги.
Руками писали плохой код — ИИ тоже пишет плохой код. Проблема не в инструменте, а в том, кто его использует. Инструментом нужно учиться пользоваться, правильно его настраивать. Но у ИИ есть особая опасность: низкий порог входа. Взял, запустил, что-то получилось — и понеслось. Это открывает дверь для людей без достаточной квалификации, которые даже не понимают, что именно они сгенерировали.
Я не оправдываю утверждение «писать говнокод — это нормально». Конечно нет! Но бизнесу, который за всё это платит, важно одно: чтобы работало и приносило деньги.
Руками писали плохой код — ИИ тоже пишет плохой код. Проблема не в инструменте, а в том, кто его использует. Инструментом нужно учиться пользоваться, правильно его настраивать. Но у ИИ есть особая опасность: низкий порог входа. Взял, запустил, что-то получилось — и понеслось. Это открывает дверь для людей без достаточной квалификации, которые даже не понимают, что именно они сгенерировали.
💯67❤11🔥4👎2
Встречаемся в московском офисе Яндекса, чтобы вместе с JVM-сообществом обсудить практический опыт, новые подходы и реальные задачи индустрии в неформальной атмосфере.
В программе:
— Андрей Кулешов, руководитель отдела разработки в Yandex Infrastructure, расскажет, как Java-фреймворки ускоряются на примере Quarkus. Узнайте, почему Quarkus стартует быстро даже без GraalVM, что именно делает ArC (как имплементация CDI), и при чём здесь Gizmo/ASM и индексирование классов через Jandex.
— Дмитрий Некрылов, бэкенд-разработчик в Yandex Robotics, разберет, как устроен трассирующий профайлер на примере Qubership Profiler — инструмента для детального анализа производительности отдельных вызовов.
— Всеволод Жолобо, разработчик в Финансовом департаменте Яндекса, выступит с разбором реальных продакшен-багов, которые произошли из-за неправильной работы со временем в Java, и объяснит,почему они вообще возможны.
Все доклады и активности можно найти на сайте. Если не сможете приехать, подключайтесь онлайн.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤2👎1🔥1
DecomposeSettings.👉 Тип
Child#key изменён с Any на String — это breaking change, но нужный. Раньше иногда падало с Key XYZ was used multiple times в Compose. Теперь ключ можно использовать напрямую как Compose key без лишних приседаний.👉 Новый
DecomposeSettings API собирает глобальную конфигурацию в одном месте. Настроить можно через update {}:// Инициализация в точке входа (Application / main)
DecomposeSettings.update { settings ->
settings.copy(
duplicateConfigurationsEnabled = true,
mainThreadCheckEnabled = false,
onDecomposeError = { error -> Timber.e(error) }
)
}
👉 Из остального: поддержка per-child аниматоров в Child Panels, новые
ChildPages composable с доступом к PagerState, улучшенный handleDeepLink с дополнительными параметрами, Compose обновлён до 1.9.3.#KMP #Kotlin #Decompose
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥32👍5👎4🎉1
👉 Name-based destructuring — пожалуй, самое интересное. Раньше деструктуризация работала по позиции через componentN(), и если порядок полей в data class не совпадал с переменными — получали молчаливый баг. Теперь можно явно привязать переменную к имени свойства. Пока это Experimental, включается через -Xname-based-destructuring. Жду когда дойдёт до Stable.
👉 Поддержка Gradle 9.3.0. Плюс Kotlin/JVM теперь по умолчанию использует Build Tools API при компиляции. Тихое, но важное изменение для тех, кто следит за тулингом.
👉 Kotlin/Native получил новый экспериментальный режим интероперабельности с C/ObjC — призван решить проблему совместимости KMP-библиотек между версиями компилятора. Если используете cinterop — стоит попробовать и оставить фидбек.
🔗 Больше подробностей в "What's new"
#Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12👍9👎2
Destructuring Declarations - несамая популярная фича в Kotlin. На мой взгляд, её привязка к порядку декларации свойств делает его очень ненадёжной. Теперь же можно будет делать привязку "имя - имя" помимо "имя - позиция":
data class User(val username: String, val email: String)
val user = User("alice", "alice@example.com")
// Было
val (email, username) = user
// Стало
(val mail = email, val name = username) = user
Фича экспериментальная и требует включения через опции компилятора
// build.gradle.kts
kotlin {
compilerOptions {
freeCompilerArgs.add("-Xname-based-destructuring=only-syntax")
}
}
🔗 Подробности в документации
#Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31🤔18👍6
@OptIn(ExperimentalStdlibApi::class)
fun main() {
val map = mutableMapOf(
1 to 1,
2 to 2,
3 to 3,
4 to 4
)
val toRemove = map.entries
.filter { it.key % 2 == 0 }
.map { it.copy() }
map.entries.removeAll(toRemove)
println("map = $map")
// map = {1=1, 3=3}
}
#Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯34🔥9🤔8🏆3
Вышел стабильный Koin 4.2.0 — изменений ощутимо больше, чем обычно в минорных релизах. Kotlin 2.3.20 внутри и несколько новых модулей.
Что появилось:
EntryProvider с передачей метаданных (анимации и прочее), generic EntryProvider, навигационные скоупы. Плюс скоупированная навигация теперь есть и для классического Compose Nav 2👉 strictOverride — новая опция для явного переопределения дефиниций. Раньше override был неявным, теперь можно сделать это контролируемым
BeanDef.На мой взгляд, Dagger Bridge и поддержка Navigation3 — самые интересные новинки. Первый открывает путь к постепенной миграции с Dagger, второй закрывает ожидаемый пробел для тех, кто уже на новом стеке навигации.
#Kotlin #KMP #DI #Koin #AndroidDev #Compose #AndroidJetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32🔥10👎5
kotlinx.datetime extension функциями.// Парсинг с кастомным форматом
val date = "11/15/2024".toLocaldate("MM/dd/yyyy")
// Вместо plus(n * -1, DateTimeUnit.DAY)
val yesterday = date.minusDays(1)
// Готовые утилиты
val isWeekend = LocalDate.today().isWeekend()
val nextMonday = LocalDate.nextMonday()
До 1.0 ещё далеко, но для KMP-проекта подключить и не писать одни и те же хелперы в каждом модуле — звучит разумно.
#Kotlin #KMP #Android #AndroidDev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍39👎11🥰2
JetBrains открыли официальный репозиторий kotlin-agent-skills с готовыми скиллами для ИИ-агентов. Появился он не просто так: стандарт Agent Skills набирает обороты, и у команды Kotlin явно есть что сказать своему агенту насчёт Kotlin-специфики.
Если коротко, скилл это папка с
SKILL.md внутри. В файле YAML-шапка с именем и описанием, а дальше инструкции для агента. Claude, Copilot, Junie и другие поддерживающие инструменты загружают их по необходимости, не загромождая контекст лишними токенами.AGP 9 Migration (
kotlin-tooling-agp9-migration). Это первый и пока основной скилл. Помогает агенту правильно провести проект через изменения Android Gradle Plugin 9.0 в Kotlin/KMP проектах.Сейчас определены две категории:
backend для серверной разработки на Spring и JPA, и tooling для инструментов сборки. Судя по открытым PR, скоро появятся новые.Я сам активно использую скиллы в работе с Claude Code, в том числе пишу под свои проекты. Это действительно удобно: один раз описал соглашения или специфику библиотеки и агент их подхватывает сам, без ручного объяснения каждый раз. Посмотрим, насколько активно JetBrains будут наполнять этот репозиторий.
#Kotlin #KMP #Android #AI
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41👎5
JetBrains опубликовали документацию по экспериментальной фиче: импорт Swift Package Manager пакетов прямо из
build.gradle.kts KMP модуля.// build.gradle.kts
kotlin {
iosArm64()
iosSimulatorArm64()
// Настраиваем зависимости
swiftPMDependencies {
swiftPackage(
url = url("https://github.com/firebase/firebase-ios-sdk.git"),
version = from("12.5.0"),
products = listOf(product("FirebaseAnalytics")),
)
}
}
После синка импортируешь API в
iosMain через неймспейс swiftPMImport.<group>.<module>:import swiftPMImport.groupName.subproject.FIRAnalytics
import swiftPMImport.groupName.subproject.FIRApp
Что ещё поддерживается:
👉 Версии в стиле
Package.swift — from(), exact(), branch(), revision()👉 Локальные пакеты с диска через
localSwiftPackage()👉 Платформенные ограничения — например, Google Maps только для iOS, даже если проект таргетит macOS
Фича работает на dev-версии Kotlin `2.3.20-titan-222`, в продакшен не годится. Экспорт KMP модуля обратно как Swift-пакета пока не поддерживается.
🔗 Источник: kotlinlang.org
#KMP #Kotlin #iOS #SPM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍47👎1
👉 Context parameters стабильны
👉 Stable: новые возможности для annotation use-site targets
👉 Experimental: явные context arguments — теперь можно явно указать контекст при вызове перегруженной функции
👉 Поддержка Java 26
👉 Аннотации в Kotlin metadata включены по умолчанию — annotation processors могут работать с ними без рефлексии
👉 Swift packages как зависимости в KMP через Gradle
👉 Intra-module inlining при компиляции в
.klib включён по умолчанию для Native/JS/Wasm🔗 Источник kotlinlang.org
#Kotlin #KMP
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍29👎1
В сегодняшнем бета-релизе Kotlin 2.4 context parameters получили статус Stable. Флаг
-Xcontext-parameters больше не нужен.Фича позволяет объявить зависимость функции от контекста, не передавая её явным параметром через всю цепочку вызовов. Компилятор смотрит, какой тип доступен в текущем скоупе, и подставляет его сам:
context(logger: Logger)
fun fetchUser(id: String): User {
logger.log("Fetching $id")
return api.getUser(id)
}
Никакой магии нет — context parameters компилируются в обычные параметры функции, которые идут первыми в сигнатуре. Весь резолвинг происходит на этапе компиляции, в рантайме это просто обычный вызов метода. Ноль overhead.
// Что реально генерирует компилятор
fun fetchUser(logger: Logger, id: String): User
У меня возник вопрос: "зачем нужны context paramter при наличии extension function". Ext fun расширяет API типа,
this внутри это и есть ваш тип. Context parameter в функции требует тип для работы, но не является его частью. Разница становится очевидной, когда зависимостей несколько:// Extension с несколькими зависимостями выглядит натянуто
fun Logger.fetchUser(analytics: Analytics, db: Database, id: String): User
// Context parameters читаются как декларация зависимостей
context(logger: Logger, analytics: Analytics, db: Database)
fun fetchUser(id: String): User
Extension function не может быть расширением сразу нескольких типов одновременно, context parameters этого ограничения не имеют.
🔗 Подробнее kotlinlang.org
#Kotlin #KMP #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
👍54👎8
GitHub
GitHub - whyoleg/cryptography-kotlin: Kotlin Multiplatform cryptography / crypto library
Kotlin Multiplatform cryptography / crypto library - whyoleg/cryptography-kotlin
🔐 Вышла cryptography-kotlin 0.6.0 с кучей новых алгоритмов и нормальной документацией.
Эта Kotlin Multiplatform обёртка над OpenSSL, CryptoKit, WebCrypto и JDK — на каждой платформе юзаешь нативный провайдер, но API один. Полезна когда криптография должна работать везде.
В 0.6.0 добавили EdDSA (Ed25519, Ed448), XDH (X25519, X448), ChaCha20-Poly1305, Diffie-Hellman, DSA и несколько вариантов AES. Теперь подписываешь и шифруешь на всех основных алгоритмах. JWK encoding тоже есть для RSA, ECDSA, XDH и EdDSA, плюс API для вывода публичного ключа из приватного.
Документация пересобрана с нуля и теперь полноценно описывает всё.
Есть breaking changes в интерфейсах Key, EncodableKey и связанных с ними
#Kotlin #KMP #Безопасность
Эта Kotlin Multiplatform обёртка над OpenSSL, CryptoKit, WebCrypto и JDK — на каждой платформе юзаешь нативный провайдер, но API один. Полезна когда криптография должна работать везде.
В 0.6.0 добавили EdDSA (Ed25519, Ed448), XDH (X25519, X448), ChaCha20-Poly1305, Diffie-Hellman, DSA и несколько вариантов AES. Теперь подписываешь и шифруешь на всех основных алгоритмах. JWK encoding тоже есть для RSA, ECDSA, XDH и EdDSA, плюс API для вывода публичного ключа из приватного.
Документация пересобрана с нуля и теперь полноценно описывает всё.
Есть breaking changes в интерфейсах Key, EncodableKey и связанных с ними
#Kotlin #KMP #Безопасность
👍44👎1
WiretapKMP закрывает сценарий мониторинга сетевых запросов, который раньше требовал двух отдельных инструментов: Chucker на Android и Wormholy на iOS. Одна библиотека, один инспектор, работает без прокси-сервера.
Подключается через плагин под ваш HTTP-клиент:
👉
wiretap-ktor — Android, iOS, JVM👉
wiretap-okhttp — Android, JVM👉
wiretap-urlsession — iOS (Swift)Из коробки пишет HTTP и WebSocket трафик: URL, заголовки, тела запросов и ответов, статус-коды, тайминги, детали TLS. UI на Compose Multiplatform, адаптивный — на планшете и десктопе раскрывается в list-detail.
Для продакшена предусмотрены noop-варианты: wiretap-ktor-noop вместо wiretap-ktor — никакого оверхеда, никакого условного кода.
#KMP #Kotlin #AndroidDev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍35👎3
Если честно, я быстрее всего «ломаюсь» не от задач, а от того, что весь день в одной позе. Поэтому я прям топлю за вещи, которые помогают телу пережить рабочие марафоны.
— Стол регулируемый Terra R 2.0 - Очень спасает, когда надо то сидеть, то вставать: и спина "спасибо" говорит, и голова чуть лучше варит.
— Встраиваемая беспроводная зарядка Ergostol AirCharge - У меня вечная история: кабель «куда-то делся», телефон на 3% и начинается суета. Встроенная зарядка — это реально про спокойствие и порядок на столе.
ANDROID10 — ещё –10% на все столы и опции к ним! P.S: Так же специально для моих подписчиков промокод действует и на Ozon
Реклама. ООО «СОФТЭФФЕКТ». ИНН 7735575262
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7👎5
Новый флаг
exceptionsWithDebugInfo в JsonConfiguration управляет этим поведением. По умолчанию сейчас true, то есть поведение старое: в сообщении исключения виден весь входящий JSON. Выставить в false — и пользовательские данные из логов исчезают. Важный момент: когда свойство станет стабильным, дефолт сменится на false. То есть это тихая breaking change в будущем — стоит держать в голове.Второе изменение — публичный API исключений.
JsonException, JsonDecodingException и JsonEncodingException теперь открыты для прямой работы: у них появились публичные свойства shortMessage, path, offset. Это удобно для REST API — можно вернуть клиенту структурированный ответ об ошибке парсинга вместо того, чтобы парсить строку сообщения вручную. API пока experimental.Релиз основан на Kotlin 2.3.20.
🔗 Release Notes
#Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24👎2