@RestrictsSuspension注解
扩展函数(lambda表达式)可以被标记为suspend,这样使得用户可以创建其他DSLs以及其它API。某情况下,库的作者需要阻止用户添加新的协同程序挂起。
为了实现这个目标,@Restricts挂起注解可以实现这个功能。当一个接收者类或接口R被@Restricts标记时,所有的挂起的扩展都必须委托给R的成员或其他扩展。因为扩展不能委托给每个其他额无限运行的程序,这就保障了所有挂起都是通过调用R的成员,挂起将是可控的。
当封装库里的所有的挂起程序都被以一种特殊的方式处理了时上述特性将很有意义。比如,当通过buildSequence()函数实现生成器(如下所述),我们需要确保任何挂起程序结束时调用yield()或yieldAll()函数,而不是其他的任何函数,这就是为什么SequenceBuilder会被标记为@RestrictsSuspension。
@RestrictsSuspension
public abstract class SequenceBuilder<in T> {
...
}
相关源代码请查看Github。