Что такое state machine в контексте корутин
Что проверяют
Понимаете ли вы, что suspend это не магия рантайма, а трансформация компилятора. От этого зависит умение читать стектрейсы корутин, оценивать их цену и видеть утечки, поэтому вопрос любят на средних и старших грейдах.
Как отвечать
Компилятор Kotlin переписывает каждую suspend-функцию в стиле передачи продолжения: добавляет скрытый параметр Continuation и генерирует класс с полем label и полями под локальные переменные, которые должны пережить приостановку. Тело функции переезжает в invokeSuspend, где стоит when по label.
Перед каждой точкой приостановки label увеличивается. Если вызванная функция вернула COROUTINE_SUSPENDED, invokeSuspend возвращает этот маркер наверх и поток освобождается. Когда результат готов, resumeWith снова вызывает invokeSuspend, when прыгает на нужную ветку, и выполнение продолжается ровно с той строки.
suspend fun load(id: Long): User {
val raw = api.fetch(id) // точка приостановки: состояние 1
val user = parse(raw) // обычный код, состояний не добавляет
return db.save(user) // ещё одна: состояние 2
}Состояний столько, сколько точек приостановки плюс входное. Отсюда и дешевизна корутины: один объект в куче вместо отдельного стека потока.
Где спотыкаются
Отвечают про sealed class с состояниями загрузки, успеха и ошибки во вьюмодели. Это паттерн состояния экрана, к машине состояний компилятора он отношения не имеет. Если вопрос звучит неоднозначно, уточните уровень, о котором речь.
Не связывают трансформацию с памятью. Всё, что живёт через приостановку, становится полем объекта продолжения, поэтому захваченная ссылка на контекст или вью держится до конца корутины, и отмена скоупа тут не формальность.
Называют корутину лёгким потоком. Потока у неё нет: между приостановками код выполняется на обычном потоке диспетчера, и блокирующий вызов внутри suspend-функции блокирует именно его, никакая машина состояний от этого не спасает.