Kotlin — итоги
Кратко — что стоит унести из раздела "Kotlin". Если пункт кажется туманным — откройте указанную главу или оглавление.
FAQ — Часто задаваемые вопросы
Типичные сбои и ситуации, с которыми сталкиваются новички после раздела. Здесь — что делать и где копать в главах; определения для зачёта — в чек-листе.
Вопрос. Переписал Java-класс на Kotlin, а при запуске снова падает с NullPointerException — разве Kotlin это убирает?
Ответ. Kotlin убирает NPE только там, где типы помечены как non-null и вы не обходите проверки через платформенные типы из Java или !!. Смешанный проект чаще ломается на границе: Java вернула null, Kotlin ожидал String. Сначала пройдите nullable на границе и Kotlin ↔ Java. Подробнее здесь — типы.
Вопрос. Android Studio пишет "Gradle sync failed" сразу после открытия учебного проекта — с чего начать?
Ответ. Проверьте JDK в настройках IDE, версию Android Gradle Plugin и доступ в интернет для скачивания зависимостей. Ошибка в логе Sync обычно указывает на конкретный модуль или репозиторий. Подробнее здесь — что знать перед Kotlin, первая программа.
Вопрос. Пишу на Kotlin, но код выглядит как Java: геттеры, сеттеры, if (x != null) на каждом шагу.
Ответ. Идиоматичный Kotlin опирается на val, свойства, ?., ?:, when и data-классы вместо шаблонного кода. Перечитайте основы и синтаксис, затем сравните свой фрагмент с примерами в рекомендациях.
Вопрос. Вызвал delay(1000) в обычной функции — компилятор ругается на suspend.
Ответ. delay и другие suspend-функции работают только внутри корутины или другой suspend-функции. Оберните вызов в runBlocking (консоль) или launch/async в scope приложения. Подробнее здесь — корутины.
Вопрос. На Android UI "замирает" на несколько секунд после нажатия кнопки.
Ответ. Тяжёлую работу (сеть, БД, парсинг JSON) выносите с главного потока: Dispatchers.IO или viewModelScope + корутины. Блокировка main thread — частая причина ANR. Подробнее здесь — корутины, Compose + Room.
Вопрос. Запустил Ktor-сервер локально — "Address already in use".
Ответ. Порт уже занят предыдущим запуском или другим сервисом. Завершите старый процесс, смените port в конфиге или найдите процесс через netstat/диспетчер задач. Подробнее здесь — Ktor — первая программа.
Вопрос. lateinit property X has not been initialized при открытии экрана.
Ответ. lateinit требует присвоения до первого чтения (часто в onCreate или во ViewModel). Для однократной ленивой инициализации с thread-safety смотрите by lazy. Подробнее здесь — основы, ООП.
Вопрос. Сравниваю два data class через ==, но в коллекции "дубликат" не находится.
Ответ. == для data class сравнивает поля; в Set/Map важны согласованные equals/hashCode (для data class генерируются). Если класс обычный или поля изменяемые (var), поведение другое. Подробнее здесь — ООП, коллекции.
Вопрос. when без аргумента не компилируется — "branch is never reachable".
Ответ. Для sealed-иерархий when должен быть исчерпывающим: либо все подтипы перечислены, либо есть else. После добавления нового подкласса компилятор снова укажет на пропуск. Подробнее здесь — конструкции.
Вопрос. Из Java не виден метод companion object — только статики Java.
Ответ. Для вызова из Java пометьте метод @JvmStatic или обращайтесь к Companion. Имена и видимость на границе JVM описаны в Kotlin ↔ Java.
Вопрос. Добавил extension fun String.foo(), а в другом файле метод "не находится".
Ответ. Extension нужно импортировать так же, как обычную функцию верхнего уровня. Он не меняет класс на JVM, а только синтаксический сахар. Подробнее здесь — ООП, синтаксис.
Вопрос. Compose перерисовывает экран бесконечно, лог сыпется тысячами recomposition.
Ответ. Частая причина — новое состояние создаётся прямо в теле @Composable без remember/mutableStateOf, или в LaunchedEffect без ключей меняется state на каждом кадре. Стабилизируйте state и поднимайте его в ViewModel. Подробнее здесь — Compose — первый экран.
Вопрос. Room ругается: "Cannot access database on the main thread".
Ответ. Запросы к БД выполняйте в фоне (Dispatchers.IO, suspend DAO, flow с правильным collector). Подробнее здесь — Room + ViewModel.
Вопрос. Сборка падает: "Kotlin JVM target 21" не совпадает с Java compile 17.
Ответ. Выровняйте jvmTarget, sourceCompatibility и targetCompatibility в Gradle для всех модулей. Смешанный Java/Kotlin проект ломается при разных bytecode level. Подробнее здесь — первая программа, Kotlin ↔ Java.
Вопрос. KMP: "Expected class has no actual declaration" для iOS.
Ответ. Для каждого expect в common-модуле нужен actual в platform-модуле (androidMain, iosMain и т.д.). Проверьте структуру source sets и имена пакетов. Подробнее здесь — Compose Multiplatform, экосистема.
Вопрос. JSON не сериализуется — "Serializer for class X is not found".
Ответ. Подключите плагин kotlinx.serialization, аннотацию @Serializable и зависимость в Gradle; для полиморфизма настройте Json и дескрипторы. Подробнее здесь — конструкции, экосистема.
Вопрос. Тесты на Mockito проходят в Java-модуле, а в Kotlin — "cannot mock final class".
Ответ. Классы Kotlin по умолчанию final; для моков используйте MockK или откройте класс/mockito-inline. Подробнее здесь — тестирование.
Вопрос. Файл .kts запускается иначе, чем .kt — почему нет main?
Ответ. Скрипт Gradle/утилитный .kts исполняется как сценарий; для обычного приложения нужен fun main() в .kt или настройка задачи в Gradle. Подробнее здесь — первая программа.
Вопрос. IntelliJ подсвечивает Kotlin красным, но проект на Java собирается.
Ответ. Убедитесь, что в модуле включён Kotlin plugin, sources помечены как Kotlin, а не Java, и выполнен Gradle import. Иногда помогает Invalidate Caches. Подробнее здесь — что знать перед Kotlin.
Вопрос. Flow в UI ничего не показывает, хотя в логе emit есть.
Ответ. Cold Flow начинает работу при collect; проверьте lifecycle (Android: repeatOnLifecycle), не блокируйте collector и не создавайте несколько конкурирующих collect без shareIn. Подробнее здесь — Flow.
Вопрос. Использовал GlobalScope.launch — после закрытия Activity корутина всё ещё держит ссылку.
Ответ. Привязывайте корутины к структурированному scope (viewModelScope, lifecycleScope, свой CoroutineScope с SupervisorJob). GlobalScope не отменяется вместе с экраном. Подробнее здесь — корутины.
Вопрос. Sequence vs List — обработал миллион элементов, память закончилась.
Ответ. Цепочки на List создают промежуточные коллекции; для больших потоков данных используйте ленивый Sequence или Flow. Подробнее здесь — коллекции и Sequence.
Вопрос. Spring Boot на Kotlin: бин не создаётся, в логе "parameter 0 required a bean of type X".
Ответ. Класс мог остаться final без @Configuration/open для CGLIB, или конструктор не помечен для injection. Сверьтесь с Spring Boot на Kotlin и Kotlin ↔ Java.
Вопрос. readln() в Windows выводит кракозябры в консоли.
Ответ. Задайте UTF-8 для JVM (-Dfile.encoding=UTF-8) или настройте кодировку терминала IDE. Подробнее здесь — консольный ввод-вывод.
Вопрос. Перехватил исключение, но приложение всё равно падает с "FATAL EXCEPTION".
Ответ. На Android необработанное исключение в другом потоке или в корутине без CoroutineExceptionHandler всё равно завершит процесс. Логируйте cause и обрабатывайте ошибки на границе UI. Подробнее здесь — исключения.
Вопрос. Не понимаю, идти в Android, Ktor или Spring — материалов слишком много.
Ответ. Выберите один маршрут из оглавления и не смешивайте в первую неделю: Compose, Ktor или Spring. Общая база языка — основы–конструкции, затем ветка по цели.
Вопрос. inline fun с reified не компилируется в публичном API библиотеки.
Ответ. Reified доступен только в inline-функциях на стороне вызывающего кода; для публичных ABI-stable API используйте обычные generics или отдельные фабрики. Подробнее здесь — конструкции.
Вопрос. Kotlin или Java для Android — что выбрать в 2025 году?
Ответ. Для новых приложений Google рекомендует Kotlin; Java нужен, если вы поддерживаете legacy-код или учите enterprise-стек. Оба языка работают на JVM в одном проекте. Подробнее здесь — о разделе, экосистема, Kotlin ↔ Java.
Вопрос. Как научиться Kotlin с нуля бесплатно?
Ответ. Пройдите маршрут: что знать перед Kotlin → первая программа → основы–конструкции, затем одну ветку (Android, Ktor или Spring) из оглавления. Подробнее здесь — история и контекст.
Вопрос. Чем Kotlin лучше Java — кратко для собеседования.
Ответ. Меньше шаблонного кода, nullable-типы на этапе компиляции, data class, корутины вместо тяжёлых потоков, современный синтаксис при полной совместимости с Java. Подробнее здесь — основы, синтаксис.
Вопрос. Что такое корутины в Kotlin простыми словами?
Ответ. Это легковесные задачи, которые можно приостанавливать (suspend) без блокировки потока — удобно для сети и UI. Запускают через launch/async в scope. Подробнее здесь — корутины.
Вопрос. Kotlin Multiplatform (KMP) — что это и зачем?
Ответ. Общая бизнес-логика на Kotlin для Android, iOS, desktop и web с платформенным UI. Не заменяет полностью нативные SDK, но сокращает дублирование. Подробнее здесь — Compose Multiplatform, экосистема.
Вопрос. Ktor или Spring Boot на Kotlin для backend?
Ответ. Ktor — лёгкий фреймворк JetBrains с корутинами; Spring — стандарт enterprise с огромной экосистемой. Для учебного API начните с Ktor, для корпоративного стека — Spring Boot на Kotlin.
Вопрос. Как установить Kotlin на Windows и запустить первую программу?
Ответ. Проще всего через IntelliJ IDEA или Android Studio: JDK + плагин Kotlin, проект Gradle. Консольный kotlinc нужен реже. Подробнее здесь — первая программа, что знать перед Kotlin.
Вопрос. Jetpack Compose на Kotlin — с чего начать новичку?
Ответ. После основ и корутин откройте Compose — первый экран, затем Room + ViewModel. Подробнее здесь — оглавление Android-маршрута.
Вопрос. Nullable типы в Kotlin — как избежать NPE?
Ответ. Тип String? явно допускает null; безопасный доступ ?., значение по умолчанию ?:, проверка через let. Оператор !! — только когда null невозможен по логике. Подробнее здесь — типы.
Вопрос. Data class в Kotlin — зачем нужен?
Ответ. Компилятор генерирует equals, hashCode, toString, copy и компоненты для деструктуризации — идеально для DTO и моделей. Подробнее здесь — ООП.
Вопрос. Kotlin Flow — чем отличается от RxJava и LiveData?
Ответ. Flow — холодный асинхронный поток из корутин-экосистемы; проще интегрируется с suspend и structured concurrency. Подробнее здесь — Flow, корутины.
Вопрос. Как перевести Java-проект на Kotlin постепенно?
Ответ. В IntelliJ: Code → Convert Java File to Kotlin File по файлам; новые модули пишите на Kotlin, старые трогайте при правках. Следите за null на границе. Подробнее здесь — Kotlin ↔ Java.
Вопрос. Сколько времени учить Kotlin до первого Android-приложения?
Ответ. При знании основ программирования база языка — 2–3 недели по маршруту; первый экран Compose — ещё около недели практики. С нуля без Java заложите больше времени на основы–ООП.
Вопрос. Kotlin для backend-разработчика — востребован ли?
Ответ. Да в Android, Ktor/Spring-сервисах и KMP-командах; в чистом enterprise Java всё ещё доминирует Java, но Kotlin растёт. Подробнее здесь — экосистема, Spring Boot.
Вопрос. Kotlin сериализация JSON — какая библиотека?
Ответ. Официальный путь — kotlinx.serialization с @Serializable и плагином компилятора; в Spring часто Jackson/Moshi через Java-стек. Подробнее здесь — конструкции, экосистема.
Вопрос. suspend функция в Kotlin — что это?
Ответ. Функция, которую можно приостановить без блокировки потока; вызывается только из корутины или другой suspend-функции. Подробнее здесь — корутины.
Вопрос. Kotlin DSL для Gradle — нужно ли учить?
Ответ. Для Android и JVM-проектов build.gradle.kts встречается часто; синтаксис Kotlin плюс API Gradle. Подробнее здесь — DSL, сравнение с Groovy — Groovy — Gradle.
Вопрос. Тесты на Kotlin — JUnit или MockK?
Ответ. JUnit 5 — каркас; MockK — идиоматичные моки для Kotlin (final-классы, extension). Kotest — альтернатива со стилем BDD. Подробнее здесь — тестирование.
Вопрос. Kotlin/Native — можно ли писать приложения без JVM?
Ответ. Да, компиляция в нативный код через LLVM (iOS, desktop); в связке с KMP — общая логика. Это отдельная ветка от классического Android на JVM. Подробнее здесь — экосистема, о разделе.
Вопрос. Kotlin vs Swift — что учить для мобильной разработки?
Ответ. Kotlin — Android и KMP; Swift — iOS/macOS и экосистема Apple. Кроссплатформу с общим UI не даёт один язык; KMP делит логику. Подробнее здесь — Swift — о разделе, Compose Multiplatform.
Вопрос. Где бесплатный справочник по синтаксису Kotlin на русском?
Ответ. В этом разделе энциклопедии: справочник, основы, чек-лист для самопроверки. Подробнее здесь — оглавление.
Вопрос. Ошибка "Unresolved reference" в Kotlin в IDE — что проверить?
Ответ. Gradle Sync, source set, зависимость в build.gradle.kts, правильный import и что файл в каталоге src/main/kotlin. Подробнее здесь — первая программа, что знать перед Kotlin.
Вопрос. Kotlin для автоматизации и скриптов — как запустить .kts?
Ответ. Файлы .kts выполняются как скрипты Kotlin (в т.ч. Gradle); для утилит часто достаточно IDEA или kotlin -script. Подробнее здесь — первая программа, консольный ввод-вывод.
Вопрос. Sealed class в Kotlin — когда использовать?
Ответ. Для ограниченного набора вариантов состояния (UI state, результат операции) с исчерпывающим when. Подробнее здесь — конструкции, ООП.
Что запомнить
Kotlin — это статически типизированный, мультипарадигменный язык программирования, разработанный компанией JetBrains как современная альтернатива Java. Он полностью совместим с JVM, может компилироваться в JavaScript и нативный код (через Kotlin/Native), а также официально поддерживается Google для разработки Android-приложений.
Основные особенности Kotlin:
- Полная взаимодействие с Java: Kotlin-код может вызывать Java-библиотеки и наоборот без дополнительных прослоек;
- Безопасность от null: система типов различает nullable и non-nullable типы, что исключает
NullPointerExceptionна этапе компиляции; - Лаконичный и выразительный синтаксис — меньше шаблонного кода благодаря data-классам, свойствам, расширениям и выводу типов;
- Поддержка функционального программирования — лямбды, высшие функции, операторы над коллекциями,
Sequence; - Современные конструкции языка — делегирование свойств, сопоставление с образцом (
when), корутины для асинхронности; - Мультиплатформенность — общий код может использоваться на Android, iOS, сервере, десктопе и в браузере через Kotlin Multiplatform.
Области применения Kotlin:
- Android-разработка — основной язык для мобильных приложений на платформе Google;
- Серверная разработка — Ktor, Spring Boot, Micronaut позволяют создавать высокопроизводительные сервисы;
- Кроссплатформенные приложения — общая бизнес-логика между платформами через Kotlin Multiplatform Mobile (KMM);
- Скрипты и автоматизация — исполняемые
.kts-файлы; - Встраивание в существующие Java-проекты — постепенный переход без переписывания всего кода.
Экосистема Kotlin включает:
- IntelliJ IDEA и Android Studio — лучшая поддержка IDE "из коробки";
- Gradle и Maven — системы сборки с плагинами для Kotlin;
- Coroutines — легковесная модель асинхронности без callback hell;
- Kotlinx-библиотеки — сериализация, HTML DSL, datetime, test;
- Dokka — генератор документации, аналог Javadoc.
Три основных правила эффективной работы с Kotlin:
- Использовать неизменяемость по умолчанию (
val,List,data class); - Применять корутины вместо потоков или RxJava для асинхронных задач;
- Писать идиоматический Kotlin, а не "Java на Kotlin’е" — избегать сеттеров, геттеров, избыточных проверок на null.
Три фундаментальных момента:
- Kotlin — это самостоятельный язык с собственной философией;
- Его сила — в безопасности, краткости и плавном внедрении в существующие проекты;
- Знание стандартной библиотеки Kotlin (
kotlin.*,kotlinx.*) критически важно для эффективной разработки.
Куда идти дальше
| Тема | Раздел |
|---|---|
| "Smalltalk — о разделе" | "Smalltalk — о разделе" |
| "Go — о разделе" | "Go — о разделе" |
| "PHP — о разделе" | "PHP — о разделе" |
| "Ruby — о разделе" | "Ruby — о разделе" |
Проверьте себя: Чек-лист самопроверки.