为什么CoroutineScope.launch和Coroutine.async是扩展函数而不是CoroutineScope的成员函数?

时间:2019-03-07 10:03:41

标签: kotlin kotlinx.coroutines

标题说明了我的问题。

CoroutineScope.launchCoroutine.async只是CoroutineScope的扩展函数而不是成员函数的确切原因是什么?

它提供什么好处?

我之所以问是因为这种设计背后的原因也许对将来的设计也很有帮助。

谢谢。

3 个答案:

答案 0 :(得分:2)

主要是因为使用扩展功能,即使将代码表示为一个类,也更容易在多个模块中构造代码。

CoroutineScope实际上是这种设计模式的一个很好的例子。看一下CoroutineScope.kt声明接口的位置。那里只有基本功能(plus运算符和cancel()

您提到的两个功能在Builders.common.kt中定义。如果您查看此文件的内容,可以看到有多个私有的类,这意味着它们只能在此文件中使用。这立即告诉您,CoroutineScope.kt中设计的基本功能不需要这些类,它们仅用于launch {...}async {...}

因此,如果您有一个具有多种功能的大型类,则可以将其分解为多个文件(=模块)。

答案 1 :(得分:2)

launchasync是协程构建器,但并不是唯一的构建器:在future(和another future),{{3} },publish等。显然,这些人不能成为CoroutineScope的成员,那么为什么launchasync是呢?

此外,通过作为扩展功能,您知道它们不依赖任何CoroutineScope私有(好吧,因为它们位于同一模块中,所以它们可以依赖internal s)。

答案 2 :(得分:1)

kotlinx.coroutines使用结构并发方法来确保所有错误都传播到父协程。同样,父协程默认情况下会等待其所有子协程完成。

执行Joblaunch时,每个协程都有一个async对象。在设计中使用扩展功能使其隐式工作变得更加容易,而无需代码编写者的明确关注

您可以查看更详细的说明:

https://kotlinlang.org/docs/reference/coroutines/basics.html#structured-concurrency

https://medium.com/@elizarov/structured-concurrency-722d765aa952