Kotlin для JVM
Все объяснения, задачи и лабораторная в одном месте.
Можно сохранить страницу в PDF через печать браузера. Для печати разборы ответов раскрываются автоматически.
1. Типы, null safety и smart casts
Объяснение
Тип T? допускает null, T — нет. Безопасный вызов ?. пропускает операцию при null, Elvis ?: задаёт альтернативу. !! превращает предположение автора в возможное исключение.
Задача для самостоятельного решения
Что даёт name?.length ?: 0 при name=null?
Показать разбор ответа
Ноль: безопасный вызов возвращает null, Elvis выбирает запасное значение. Для пользовательского ввода это обычно лучше необоснованного !!.
2. Функции, collections и sequences
Объяснение
Функции могут передаваться как значения. Операции List обычно создают промежуточные коллекции, Sequence выполняет цепочку лениво. Ленивость полезна не всегда: у маленьких данных есть собственные накладные расходы.
Задача для самостоятельного решения
Зачем take(10) после filter в Sequence?
Показать разбор ответа
Можно остановиться после десяти подходящих элементов, не обрабатывая весь источник. Порядок операций важен: take до filter означает другую задачу.
3. ООП, sealed types и delegation
Объяснение
Sealed-иерархия ограничивает варианты модели и помогает exhaustiveness-проверке when. Делегирование передаёт реализацию поведения другому объекту. Data class не гарантирует глубокую неизменяемость.
Задача для самостоятельного решения
Как представить Loading, Success и Failure без трёх независимых флагов?
Показать разбор ответа
Использовать sealed тип с тремя вариантами. Так нельзя одновременно оказаться и в загрузке, и в ошибке из-за несогласованных boolean-полей.
4. Coroutines, Flow и structured concurrency
Объяснение
Coroutine привязана к scope, который определяет отмену и время жизни. Flow описывает поток значений. Structured concurrency связывает дочерние задачи с родителем; GlobalScope разрывает эту связь.
Задача для самостоятельного решения
Что должно произойти с загрузкой экрана после его закрытия?
Показать разбор ответа
Scope экрана отменяется, загрузка получает отмену и освобождает ресурсы. Код не должен поглощать CancellationException как обычную бизнес-ошибку.
5. Java interoperability и Gradle
Объяснение
Java interop вводит platform types, чья nullability может быть неизвестна. Gradle описывает сборку и зависимости. Версия toolchain помогает избежать разных результатов на компьютерах разработчиков.
Задача для самостоятельного решения
Почему вызов Java может дать NPE в Kotlin без явного T??
Показать разбор ответа
Отсутствующие Java-аннотации не дают Kotlin доказать non-null. Проверяйте значение на границе и уточняйте контракт адаптера.
6. Тестирование и проектирование API
Объяснение
Тестируемое API отделяет время, сеть и хранилище от вычислений. Coroutine-тесты управляют виртуальным временем. Реальное sleep делает тесты медленными и зависимыми от планировщика.
Задача для самостоятельного решения
Как проверить retry через секунду без секундного ожидания?
Показать разбор ответа
Передать тестовый dispatcher/scheduler, вызвать ошибку и продвинуть виртуальное время. Затем проверить число вызовов и отмену после исчерпания попыток.
Лабораторная работа
Подготовка
Kotlin/JVM. Выполните пример как main в учебном проекте.
Учебный пример
fun lengthOrZero(value: String?): Int = value?.length ?: 0
fun main() {
check(lengthOrZero(null) == 0)
check(lengthOrZero("abc") == 3)
println(listOf(1,2,3).asSequence().map { it * 2 }.take(2).toList())
}Как работает пример и что ожидать
Вывод [2, 4]. Nullable-значение обрабатывается без !!, sequence останавливается после двух элементов. check выполняется и в обычном запуске; это не полный тестовый набор, а наблюдаемый контроль примера.
Итоговая работа
Создайте сервис с sealed состояниями, repository и coroutines. Тестируйте отмену scope и timeout через тестовый scheduler. Отдельно обработайте nullable данные на Java-границе.
Проверка результата
1. Опишите исходные данные и условия запуска, чтобы другой человек мог повторить работу.
2. Приложите результат обычного сценария и сравните его с ожидаемым.
3. Проверьте неверный вход, граничный случай и отказ зависимости, если она есть.
4. Объясните выбранное решение и известное ограничение.
5. Сохраните исправления после самопроверки вместе с примером, который раньше не работал.
Как оценить работу
По каждому пункту поставьте 0 (не выполнено), 1 (выполнено с пробелами) или 2 (результат воспроизводим и объяснён). Если обязательный сценарий не работает, вернитесь к нему независимо от общей суммы. Это рубрика самопроверки: сайт не исполняет присланный код и не выдаёт автоматическую оценку проекта.