Kotlin
2.17K subscribers
270 photos
123 videos
18 files
393 links
Подборки полезного материала по Kotlin. По всем вопросам @evgenycarter
Download Telegram
⌨️ Kotlin: ключ к современным backend-решениям!

📚 Курс «Kotlin Backend Developer. Professional» — всё, что нужно для создания гибких и производительных приложений.

Что вы освоите:

✔️ Работу с Kotlin Multiplatform для JS, JVM, Android, iOS.
✔️ Spring, Ktor, RabbitMQ, Kafka, Postgres.
✔️ Создание архитектуры: монолиты, микросервисы и бессерверные решения.
✔️Реальные кейсы: разработка стартапа с нуля.

Почему выбирают нас?

✔️ Живые лекции от экспертов топовых компаний.
✔️ Диплом OTUS, который признают крупные работодатели.
✔️ Практика, которая готовит к сложным проектам.

🎁 Дарим промокод, который дает скидку на обучение - Kotlin5

Не упустите шанс!

👉 Пройдите тестирование и получите скидку: https://vk.cc/cMkZGW

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Не используй use в Kotlin

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

В Java 7 для этого появилась конструкция try-with-resources, которая аккуратно складывает все исключения, а в Kotlin use реализован иначе. Например, если внутри блока работы с файлом что-то пошло не так, а потом и при закрытии возникла ошибка — ты увидишь только вторую, а первая просто исчезнет.

Поэтому лучше явно закрывать ресурсы в finally, либо использовать Java-подход, если тебе важно не терять исключения.

https://medium.com/@wn8yura/dont-use-use-in-kotlin-1005c9b6b9d4

✍️ @kotlin_lib
👍6🤣2
Заезжаем в Kotlin Multiplatform. Но какой ценой?

Этот доклад - текстовая версия моего выступления с осеннего Мобиуса 2024 года. Обязательно приложу видео с выступлением после выхода. А вот и оно.

О чем поговорим в статье:
Пройдем путь от идеи Kotlin Multiplatform до её реализации в цифрах.

Обсудим, сколько стоило внедрить Kotlin Multiplatform в продукты и к чему это привело.

Проведём ретроспективу: стоило ли это делать вообще и стоит ли инвестировать в эту технологию дальше. А также разберём, сколько это будет стоить в перспективе.

https://habr.com/ru/articles/887574/

✍️ @kotlin_lib
Не знаешь на кого пойти учиться ?💥

🛑Пройди бесплатные онлайн-курсы

🛑Узнай о самых востребованных профессиях

🛑Получи уникальную возможность поступить в «Алабуга Политех» после 9 или 11 класса

ПРОЙДИ КУРС ПРЯМО СЕЙЧАС!
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥1🍾1
Media is too big
VIEW IN TELEGRAM
Наглядный пример, когда не следовать best practices for coroutines от Google
Александр Таганов

Александр показал реальный пример из практики Т-Банка, когда следование best practices for coroutines ведет к проблемам. Объяснил, почему это происходит. Показад, чем еще занимается main dispatcher. И рассказал, как избежать подобных проблем

00:00 - Про доклад
02:44 - Долгое ожидание простых операций
12:59 - Разбор причины долгих загрузок
21:30 - Выводы после анализа
24:35 - На что стоит заменить Dispatchers.Main
27:50 - Тестирование разных Dispatcher

источник

✍️ @kotlin_lib
👍31
Почему не стоит использовать Array в data class Kotlin:

🔸 В data class методы equals() и hashCode() генерируются автоматически на основе полей.
🔸 Но Array в Kotlin (и Java) сравнивает не содержимое, а ссылки на объекты.
🔸 Из-за этого два объекта с одинаковыми массивами будут не равны:


data class Person(val name: String, val friends: Array<String>)

val p1 = Person("Mike", arrayOf("Mary", "John", "Tom"))
val p2 = Person("Mike", arrayOf("Mary", "John", "Tom"))

println(p1 == p2) // false!


🔸 Такая «ссылочная» проверка приводит к проблемам с коллекциями (HashSet, HashMap) и к «невидимым» багам: дубликаты, неверные кеш-промахи и т. д.

Решение: вместо Array используйте коллекции, которые сравнивают содержимое:


data class Person(val name: String, val friends: List<String>)


Тогда equals() проверит элементы списка по значению, и Person("Mike", listOf("Mary","John","Tom")) == Person("Mike", listOf("Mary","John","Tom")) вернёт true.

https://proandroiddev.com/avoid-using-array-in-the-data-class-constructor-in-kotlin-ebc308e46a95

✍️ @kotlin_lib
👍4
🧩 Ktorfit — это библиотека, вдохновлённая Retrofit, для HTTP-клиентов на Ktor.

Она позволяет описывать HTTP-запросы с помощью аннотаций прямо в интерфейсах, как в Retrofit. Ktorfit использует KSP (Kotlin Symbol Processing) для генерации кода, поэтому не требует рефлексии и работает быстро.

🔧 Пример использования


@HttpApi
interface GitHubApi {
@GET("users/{user}/repos")
suspend fun listRepos(@Path("user") user: String): List<Repo>
}


Ktorfit создаёт реализацию интерфейса, которую можно использовать вот так:


val ktorfit = Ktorfit.Builder()
.baseUrl("https://api.github.com/")
.httpClient(HttpClient())
.build()

val api = ktorfit.create<GitHubApi>()
val repos = api.listRepos("Foso")


📦 Особенности:

* Поддержка всех стандартных аннотаций: @GET, @POST, @Query, @Path, @Header, и др.
* Полная интеграция с Ktor HttpClient
* Генерация кода через KSP — высокая производительность
* Нет зависимости от Android
* Поддержка Kotlin Multiplatform

https://github.com/Foso/Ktorfit

✍️ @kotlin_lib
👍5🥱5
Не хотите поговорить о Kotlin Contracts?

За время собеседований я заметил одну любопытную вещь: даже опытные котлиноводы частенько не в курсе такой мощной фичи, как Kotlin Contracts.

Этой серией статей я хочу простым человеческим языком показать, зачем нужны Contracts, как их использовать на практике и как они работают внутри.

Какую проблему решают Kotlin Contracts?
Все мы любим Kotlin за умные проверки типов. Например, напишешь так:


fun foo(x: Any) {
if (x is List<*>) {
x.size // Всё ок, компилятор молодец!
}
}


И всё работает!

Но стоит вынести ту же проверку в отдельную функцию:


fun isList(x: Any): Boolean = x is List<*>

fun foo(x: Any) {
if (isList(x)) {
x.size // Ошибка: "Unresolved reference: size"
}
}


В чём подвох?

https://habr.com/ru/companies/alfa/articles/916536/

✍️ @kotlin_lib
👍4
Media is too big
VIEW IN TELEGRAM
Klibs.io — the dream of creating a Kotlin Package Index
Ignat Beresnev

So you want to build a Kotlin package index.. What is a package anyway, is it the same as an artifact? What makes a project a library then? And why is it an index and not a repository?

источник

✍️ @kotlin_lib
👍3
Media is too big
VIEW IN TELEGRAM
Подводные камни Kotlin Coroutines

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

✍️ @kotlin_lib
👎5👍1🤡1
KotlinJS в GitHub Actions

GitHub Actions (GHA) — отличный инструмент для настройки CI/CD, а в GitHub Marketplace можно найти тысячи готовых GHA под любые задачи. Но всегда же найдётся процесс, который захочется настроить под себя. Тогда нам придётся написать кастомный GHA.

Привет! Это Макс Качинкин, Android Tech Lead в Додо. В этой статье я покажу, как создать свой GHA на Kotlin/JS, используя плагин Kotlin Multiplatform, и поделюсь готовым шаблоном в GitHub, с помощью которого вы сможете быстро написать собственный экшен на Kotlin/JS. Погнали!

https://habr.com/ru/companies/dododev/articles/898704/

✍️ @kotlin_lib
👍51
Вышел Kotlin Kotlin 2.2.20-Beta1

Released: July 10, 2025

https://kotlinlang.org/docs/whatsnew-eap.html

✍️ @kotlin_lib
👍2
⌨️ Хотите перейти на новый уровень backend-разработки?

Актуальное повышение квалификации с курсом «Kotlin Backend Developer. Professional» от OTUS — это ваш шанс освоить современные практики и инструменты для масштабируемых серверных приложений. На курсе вы:

✔️ Разработаете monolith, микросервисы и serverless с помощью Kotlin и фреймворков Spring, Ktor и бессерверных библиотек.
✔️ Освоите корутины для асинхронных и многопоточных задач, а также WebSocket, RabbitMQ, Kafka для транспорта.
✔️ Научитесь строить хранилища на Postgres, Cassandra, ArcadeDb и интегрировать OpenAPI с любым фронтендом.

🗣 Преподаватели — практикующие эксперты, которые покажут реализацию проекта маркетплейса от идеи до продакшена. Программа постоянно обновляется в соответствии с требованиями рынка, а диплом OTUS ценится в крупных компаниях.

👉 Пройдите вступительное тестирование и присоединяйтесь к группе: https://vk.cc/cNJ6W8

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Ныряем в холодные потоки Kotlin Flow

Лето — лучшее время для сплава. Поэтому, если вы пока не в отпуске, давайте устроим короткий сплав по асинхронным потокам данных.

Переход из привычной императивной парадигмы иногда бывает сложным, поэтому сначала поговорим о терминах.


https://habr.com/ru/articles/922962/

✍️ @kotlin_lib
👍3
Media is too big
VIEW IN TELEGRAM
Эти фичи Kotlin меняют правила игры

0:00 Почему мы любим Kotlin
1:43 Новый долгожданный оператор
2:46 Розыгрыш книги с автографом Елизарова
4:09 Курс по OKT от АвитоТех
5:03 Обязательное использование возвращаемого результата (Must use return)
9:50 Прокачали работу с ошибками (не про исклоючения)
14:00 Куда скатился Kotlin... Много обещаний и...

источник

✍️ @kotlin_lib
👍3💩1
📲 Как сделать так, чтобы пользователи всегда возвращались туда, где они остановились в приложении?

⏺️ Присоединяйся к открытому вебинару «Flutter Deep Linking & State Restoration» 22 июля в 20:00 МСК. На вебинаре разберем:
— Типы диплинков во Flutter и как они работают с мобильными и веб-приложениями.
— Как выбрать правильную навигацию: Navigator 1.0 или Router API для сложных сценариев.
— State Restoration во Flutter: как сохранять и восстанавливать состояние после перезапуска.
— Использование Restorable Routes для автоматического возвращения на нужный экран.
❗️Этот вебинар — отличная тренировка перед стартом курса «Flutter Mobile Developer» от OTUS.
👉 Записаться на вебинар → https://vk.cc/cNLk8U


Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Избегайте использования lambda в конструкторе data-класса в Kotlin

В своих предыдущих статьях я показывал, почему использование var или Array в конструкторе data-класса Kotlin приводит к неожиданному поведению и трудноуловимым багам.
Эти проблемы в основном связаны с тем, как работают методы equals(), hashCode() и copy() — особенно при использовании в коллекциях вроде HashMap, HashSet, или в UI-фреймворках, таких как Jetpack Compose.

https://proandroiddev.com/avoid-using-lambda-in-the-data-class-constructor-in-kotlin-a7d952de25c9

✍️ @kotlin_lib
👍2
Media is too big
VIEW IN TELEGRAM
Kotlin Coroutines — Обзор инструментов отладки

Корутины создают новые сложности при отладке — обычные трассировки стека мало помогают, когда асинхронная работа была запущена кодом, выполнявшимся в другом потоке. Это видео — короткий обзор нескольких инструментов для отладки корутин, которые вы могли упустить в IntelliJ IDEA и Android Studio.

источник

✍️ @kotlin_lib
👍1
👩‍💻 Хотите создавать плавные и быстрые анимации для мобильных приложений, не замедляя их работу?

Приглашаем на открытый урок «Jetpack Compose: пишем красивые и производительные анимации».

🗓 21 июля в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Android Developer. Professional».

На открытом уроке мы расскажем, как с помощью Jetpack Compose создавать красивые и производительные анимации, которые работают без задержек и не перегружают приложение.

🎯 Мы подробно разберем ключевые инструменты анимации и расскажем, как избежать лишних рекомпозиций и профилировать анимации для повышения производительности.

🔗 Ссылка на регистрацию: https://vk.cc/cNMWI6

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 “val” — не панацея: когда immutable переменные создают проблемы

Kotlin приучает нас к val: "если переменная не меняется — сделай её immutable". Это правильно, но есть нюанс: val не гарантирует неизменяемость объекта, а только то, что ссылка не переназначится.

На практике это может привести к багам, особенно при работе с MutableList, var - свойствами в data-классах, или в многопоточном коде.


💥 Пример проблемы:


val items = mutableListOf("A", "B")
items.add("C") // OK, но items всё ещё val


Вроде бы val, значит безопасно? Нет — items мутируются. Это особенно критично, если вы:

- передаёте val в другие слои архитектуры;
- работаете с кэшем или shared state;
- делаете val глобальными или синглтонами.


🧠 Хуже в многопоточке:


class Cache {
val data = mutableMapOf<String, Any>()
}


Если доступ к data не синхронизирован — ловите гонки. А val создаёт ложное ощущение защищённости.


Как писать безопаснее:

- Используйте List, Map (immutable интерфейсы), а не MutableList, MutableMap, если нет необходимости в мутации.


val items: List<String> = listOf("A", "B")


- Если нужно менять данные — лучше явно использовать var, чтобы было видно, что объект изменчив.


var state = State()


- Для shared state — применяйте StateFlow, Mutex, atomic -типы и пр. инструменты контроля доступа.


🧵 Ещё пример — data class:


data class User(var name: String)

val user = User("Alice")
user.name = "Bob" // mutable, хотя user — val


Снаружи кажется, что user не меняется. Но его внутренности - легко. В больших командах это ведёт к багам.

⚠️ Вывод

val — это про неизменность ссылки, не объекта. Не полагайтесь на val как на гарантию иммутабельности. Будьте явными в намерениях: или делайте объект действительно immutable, или давайте понять, что он может меняться.

✍️ @kotlin_lib
👍61👎1