让我们假设我正在编写一个库,它返回一个字符串,这是一个复杂且长时间运行的任务。
我可以选择提供这个
interface StringGenerator {
suspend fun generateString(): String
}
或者
interface StringGenerator {
fun generateString(): Deferred<String>
}
这两种选择是否有任何(缺点)优点,它们是什么?我应该选择哪个?
最佳答案
Kotlin 协程是按照 "sequential by default" 设计的指南。这意味着你的 API 应该总是暴露 suspend fun
s 和用户,如果他们真的需要它,可以很容易地将它们包装在 async
中。 .
其优点类似于冷流相对于热流的优点:可暂停功能仅在控制处于其中时才处于事件状态。当它返回时,它并没有留下在后台运行的任务。
每当您返回 Deferred
,用户必须开始担心如果他们无法等待结果会发生什么。一些代码路径可能会忽略它,调用代码可能会出现异常,然后它们的应用程序就会发生泄漏。
关于kotlin - 库函数是否应该挂起或返回延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60448590/