【对比Java学Kotlin】内联类

什么是内联类?

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))

虽然可读性不错,但是跟基本类型一样,同样有了额外的存储开销。

【内联类】

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值