知方号

知方号

Kotlin contract 用法及原理

什么是 contract

contract(契约)是一种 Kotlin 面向编译器约定的一种规则,它帮助编译器更加智能地识别某些需要特定的代码条件,为代码创建更加友好的上下文关联环境。 Kotlin 在 1.3 版本以实验室功能的方式开始引入 contract, 截止至当前 Kotlin 最新版本 1.6.10,contract 方法依然添加有 @ExperimentalContracts 注解。 这说明官方认为其能力还不够稳定,但从 Kotlin 标准库已经随处可以看见 contract 的情况下看,contract 应该很快就会变为 release feature,我们可以先了解一下 contract 的能力和用法。

常见的 contract 调用

Standart.kt@kotlin.internal.InlineOnlypublic inline fun T.apply(block: T.() -> Unit): T { contract { // 告诉编译器,这个 block 一定会执行一次 callsInPlace(block, InvocationKind.EXACTLY_ONCE) } block() return this}@kotlin.internal.InlineOnlypublic inline fun T.let(block: (T) -> R): R { contract { // 告诉编译器,这个 block 一定会执行一次 callsInPlace(block, InvocationKind.EXACTLY_ONCE) } return block(this)} 引入 contract 的原因

Kotlin 编译器很强大,从它可以编译成 java 字节码和 JavaScript 就可以看出。但是再强大的编译器也有他的局限性(严格意义上甚至说不上是局限性,只是一种当前最优方案的折中做法),其中就包括智能类型转换和空判断,先举个例子:

//

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。