Перейти к основному содержимому

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:

  1. Использовать неизменяемость по умолчанию (val, List, data class);
  2. Применять корутины вместо потоков или RxJava для асинхронных задач;
  3. Писать идиоматический Kotlin, а не "Java на Kotlin’е" — избегать сеттеров, геттеров, избыточных проверок на null.

Три фундаментальных момента:

  • Kotlin — это самостоятельный язык с собственной философией;
  • Его сила — в безопасности, краткости и плавном внедрении в существующие проекты;
  • Знание стандартной библиотеки Kotlin (kotlin.*, kotlinx.*) критически важно для эффективной разработки.

Куда идти дальше

ТемаРаздел
"Smalltalk — о разделе""Smalltalk — о разделе"
"Go — о разделе""Go — о разделе"
"PHP — о разделе""PHP — о разделе"
"Ruby — о разделе""Ruby — о разделе"

Проверьте себя: Чек-лист самопроверки.