367 字
2 分钟
浅谈一下设计Kotlin异步库

开始#

Kotlin引入了一个新的概念: 挂起 这个词的英文翻译为 suspend 顾名思义就是将一段代码挂起执行 但是这个挂起并不是可以并行, 而是自动切换到另外一个线程之后再自动切回挂起之前的线程(可以是主线程也可以是任意线程), Kotlin会隐式的给所有被suspend修饰符修饰的函数加上一个参数 @NotNull Continuation<? super @NotNull Unit> $completion, 这是在Java中的表现形式

public class Test implements OneBotListener {
    @Override
    public @Nullable Object onGroupMessage(@NotNull GroupMessage message, @NotNull String json, @NotNull Continuation<? super @NotNull Unit> $completion) {
        return $completion;
    }
}

所有函数都需要返回一个上下文参数$completion来确定上下文以便恢复被挂起的协程, 这就是为什么 普通的函数无法调用挂起函数: 因为普通函数没有上下文参数

设计异步库#

在IDEA中定义了一个标准: 所有的接口和抽象类的函数如果没有用到被suspend修饰的函数不会被IDE提示移除多余的 suspend关键字, 所以想要设计一个好的异步库, OOP基础很重要, 尽量使你的库全部以 Base -> BaseImpl的形式存在

小结#

Kotlin协程库在Kotlin/JVM平台上本质上还是包装了线程这一套, 因为JVM中并没有协程的概念

在其他平台上Kotlin就有了协程的概念