IT Academy
Справочник курса

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 (результат воспроизводим и объяснён). Если обязательный сценарий не работает, вернитесь к нему независимо от общей суммы. Это рубрика самопроверки: сайт не исполняет присланный код и не выдаёт автоматическую оценку проекта.