Выбор ответа Senior Java-интероп обновлено

Как вызвать suspend-функцию из Java

Вопрос

Как удобнее всего дать Java-коду доступ к suspend fun load(): User?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Обёртка на Kotlin с CompletableFuture через scope.future. Для Java suspend-функция это метод с последним параметром Continuation и возвращаемым Object, вызывать её руками неудобно и опасно.

Варианты ответа

  1. Вызвать напрямую: Java поддерживает suspend через await
  2. Пометить функцию @JvmStatic, и Java получит обычный метод
  3. Обёртка на Kotlin с CompletableFuture через scope.futureправильный ответ
  4. Использовать @JvmOverloads, он скроет параметр Continuation

Разбор

Для Java suspend-функция это метод с последним параметром Continuation и возвращаемым Object, вызывать её руками неудобно и опасно. Обычно добавляют обёртку на Kotlin: fun loadAsync(): CompletableFuture<User> = scope.future { load() } (билдер future из kotlinx-coroutines). Java работает с привычным CompletableFuture. @JvmStatic и @JvmOverloads к suspend отношения не имеют.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме