Должна ли функция библиотеки быть приостановлена ​​или возвращена отложенной - PullRequest
2 голосов
/ 28 февраля 2020

Давайте предположим, что я пишу библиотеку, которая возвращает строку, которая является сложной и длительной задачей.

Я могу выбрать между предложением этого

interface StringGenerator {
   suspend fun generateString(): String
}

или

interface StringGenerator {
   fun generateString(): Deferred<String>
}

Есть ли какие-либо (не) преимущества любого из этих вариантов и какие они есть? Какой мне выбрать?

1 Ответ

6 голосов
/ 28 февраля 2020

Kotlin сопрограммы разработаны в соответствии с директивой «по умолчанию» . Это означает, что ваш API всегда должен предоставлять suspend fun s, и пользователь, если и когда он действительно в этом нуждается, может легко обернуть их в async.

Преимущество этого аналогично преимуществам холодный поток по отношению к горячий поток: функция приостановки активна только тогда, когда внутри нее находится управление. Когда он возвращается, он не оставил позади задачу, выполняющуюся в фоновом режиме.

Всякий раз, когда вы возвращаете Deferred, пользователь должен начать беспокоиться о том, что произойдет, если ему не удастся дождаться результата. Некоторые пути кода могут его игнорировать, вызывающий код может получить исключение, и тогда в их приложении возникает утечка.

...