💣 Почему я запрещаю Destructuring Declarations на код-ревью Котлиновский синтаксис val (name, age) = user выглядит сексуально. Python-style, кратко, молодежно. Но для бизнес-логики это мина замедленного действия. Представим классический DTO для транзакции: data class Transaction( val amount: Double, val fee: Double ) Где-то в недрах UseCase вы пишете: val (total, commission) = getTransaction() // Логика: total - commission Всё работает. Пока через полгода другой разработчик (или вы же) не решит...
Kotlin
Подборки полезного материала по Kotlin. По всем вопросам @evgenycarter
Графики
📊 Средний охват постов
📉 ERR % по дням
📋 Публикации по дням
📎 Типы контента
Лучшие публикации
16 из 16⌨️Создание AI-агентов на Kotlin Часть 1: минимальный кодовый агент Строить агентов - странная штука. Ты пишешь не код, который сам что-то делает. Ты пишешь код, который даёт LLM возможность что-то делать, а что именно делать - решает уже сама модель. К этому сдвигу мышления нужно привыкнуть. Ты даёшь агенту возможность читать файлы - и он сам решает, какие файлы читать и когда. Ты ожидаешь, что он начнёт с main-файла. А он вместо этого сначала читает три тестовых файла, чтобы понять паттерны. Ты...
💀 Невидимый this: Как одна лямбда может утечь всю Activity Мы привыкли считать, что Kotlin умнее Java. В Java анонимный класс всегда держал ссылку на внешний класс. В Kotlin компилятор пытается оптимизировать лямбды и делать их статическими синглтонами. Но эта магия ломается от одного прикосновения. Представьте код во ViewModel или Presenter: class HeavyScreen { private val bigData = ByteArray(1024 1024 20) // 20 MB private val title = "Profile" fun load() { ExternalService.fetchData { result -...
🐢 Ваш by lazy тормозит (и вы об этом не знаете) Мы привыкли писать так: val formatter by lazy { expensiveInitialization() } Это стандарт де-факто для тяжелых объектов. Но знаете ли вы, что по умолчанию lazy использует режим LazyThreadSafetyMode.SYNCHRONIZED? Что это значит под капотом: Каждое обращение к переменной (даже после того, как она инициализирована!) проходит через проверку volatile поля. А при первой инициализации создается монитор (lock), чтобы гарантировать потокобезопасность. Doubl...
🛡️ lifecycleScope - бро. Почему Coroutines не текут (почти) В прошлом посте мы выяснили: Callback Hell = Memory Hell. Вам нужно вручную отписываться в onDestroy, иначе this утечет вместе с Activity. Kotlin Coroutines предложили решение: Structured Concurrency. И в Android это реализовано через lifecycleScope и viewModelScope. Как это работает на пальцах: // Внутри Fragment / Activity lifecycleScope.launch { val user = api.getUser() // (1) Suspend point showUser(user) // (2) Update UI } Сценарий...
📉 Ваш List убивает перформанс Compose. Разбираемся со Stability Написали красивый экран на Compose. Данные не меняются, но Layout Inspector показывает, что ваш Composable со списком перерисовывается каждый чих. Почему? Потому что вы передали туда обычный List. @Composable fun UsersList(users: List<User>) { // ❌ Компилятор вам не верит // ... } В чем проблема? Compose опирается на концепцию Stability (стабильности), чтобы понимать, можно ли «скипнуть» (пропустить) рекомпозицию узла, если парамет...
🔥 Ваш StateFlow работает вхолостую. Разбираем SharingStarted Превращение Flow в StateFlow через stateIn - стандартный паттерн в ViewModel. Но третий параметр (started) - это место, где утекают ресурсы процессора и сети. Смотрим типичный код: val uiState: StateFlow<UiState> = repository.observeData() .map { it.toUiState() } .stateIn( scope = viewModelScope, started = SharingStarted.Eagerly, // 👈 Внимание сюда initialValue = UiState.Loading ) 1. SharingStarted.Eagerly - Режим "Зомби" Поток запус...
👩💻 Открытый урок «Знакомство с Kotlin: пишем первый код» 🗓 5 марта в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса «Kotlin Developer. Basic» от Otus. Программа вебинара: ✔Разберем три ключевых преимущества Kotlin: безопасность null, лаконичность и совместимость. ✔Напишем небольшой, но полезный фрагмент, который решает понятную задачу. ✔Ответим на главный вопрос: почему Kotlin — это не просто «улучшенная Java», а другой подход к разработке. Вебинар будет полезен: Начинающим разработчикам...
👨💻 Вы пишете тесты, потому что «так надо» Покрываете несколько функций, проверяете очевидные кейсы, ставите галочку. Тесты проходят, но чувствуете, что это формальность. Они не помогают находить баги, не улучшают код, не дают уверенности в изменениях. Проблема не в тестах. Проблема в том, как вы их пишете. 🗓 12 марта в 20:00 — открытый урок «Профессиональные Unit-тесты (модульные тесты) в Android: как тесты улучшают код» Разберём, что отличает хороший Модульный тест (unit-тест) от теста «для...