Kotlin 2.4.20 现已发布,新特性多不多?
· 阅读需 16 分钟
大家吼哇!Kotlin 2.4.20 已经在 9 月 7 日发布啦~ 老规矩,更新的原文在这里:What's new in Kotlin 2.4.20。
这次先在开头快速省个流:
- 标准库层面的新特性(或者说新语法)并没有那么多,有相当一部分笔墨在 debug 和 test 上;不过标准库还是补了几个挺顺手的函数的。
- 在 K/JS 方面的
suspend导出也又有了新进展。 - 还有一个让人眼前一亮的东西:Kotlin 编译器自己的 Native Image。哦?
注意!这里依旧主要介绍我个人感兴趣的更新,不保证会覆盖所有内容。如果有你关心但没提到的,记得去官方日志看看喔~下文中的代码示例,如无特殊说明,均来自或改写自官方更新日志。
Kotlin/JVM
when 的 invokedynamic 编译支持稳定
先来看看过去版本的试验性功能的稳定化。
还记得 v2.2.20 的时候,when 可以借助 invokedynamic 来生成更紧凑的字节码了吗?
现在这个特性已经稳定并默认启用了,不再需要 -Xwhen-expressions=indy。
比如这种按类型分支的代码:
open class Shape
class Circle : Shape()
class Rectangle : Shape()
class Triangle : Shape()
fun countCorners(shape: Shape) = when (shape) {
is Circle -> 0
is Rectangle -> 4
is Triangle -> 3
else -> -1
}
编译目标为 JVM 21 或更高版本时,符合条件的 when 会使用 invokedynamic 配合 SwitchBootstraps.typeSwitch(),代替原本的一串 instanceof 检查。
当然了,一切优化行为总会有其条件与限制。除了 else 之外,分支要求需要是 is 或 null 检查,且不能带 守卫条件 if,
也不能涉及 MutableList、函数类型这类无法直接进行类型检查的类型;此外还需要至少两个条件,并且都检查同一个主体。
具体限制可以看官方提供的文档说明。
有优化就是好事儿!