什么是内联类?
Kotlin 在1.2.30 版本开始试验版本的内联类,写法是:
inline class Duration(val value: Long)
从1.5版本开始,上面这种写法被废弃了,转而启用稳定版的写法:
@JvmInline
value class Duration(val value: Long)
即,由关键字 inline 转为注解 @JvmInline + 关键字 value,但是二者在构造函数里面都是有且仅有一个成员变量。
之所以要这么改变,是因为:
- inline class 有歧义,容易让人联想其跟内联函数的关系:好比抽象类里面有抽象方法,那内联类里面的都是内联方法?
- Kotlin 在下“一盘大棋”(value classes, which are classes without identity and hold values only),内联类正在转变成棋局的一部分;
为什么要有内联类?
内联类是用类的外衣包裹基本类型数据。
看起来像是一个类,但是实际上是基本类型。这样既具有代码的可读性(对开发者),又拥有基本类型的高效性(对 JVM),因为 JVM 底层会对基本类型做很多优化,而真正的类却没有这种待遇从而带来额外开销。
以两个时刻间的间距 Duration 为例,我们有几种实现方式:基本类型、常规类、内联类。我们分别来看下。
【基本类型】
greetAfterTimeout(millis: Long)
,但是我们在实际使用容易产生歧义,即 greetAfterTimeout(2)
里面的2单位是秒还是毫秒?虽然我们可以通过后缀的方法来解决这个问题greetAfterTimeoutMs(millis: Long)
、greetAfterTimeoutSec(secs: Long)
,但同时也产生了函数的冗余。
【常规类】
比如我们新建一个名为 Duration 的类:
class Duraton(val millis: Long)
fun seconds(value: Int) = Duration(value * 1000)
然后这样使用:
greetAfterTimeout(duration: Duration)
greetAfterTimeout(seconds(2))
虽然可读性不错,但是跟基本类型一样,同样有了额外的存储开销。
【内联类】
<