什么是kotlin的内联类?

问题描述 投票:0回答:3

内联类:Inline classes

我想知道kotlin中其他类的内联之间的确切区别是什么?我想知道什么是精确的内联类,以及何时使用它?

android kotlin
3个回答
2
投票

内联类只是基本类型和字符串的某种类型包装。

例如,假设我们有一个这样的接口声明:

interface ResizeableView {
    fun resize(width: Int, height: Int)
}

每次开发人员需要调用此方法时,他都需要首先检查参数顺序,以免混淆宽度和高度。

而且,如果参数最终搞砸了会发生什么?

val width: Int = someObject.width
val height: Int = someObject.height
resizeableView.resize(height, width) //compiles ok and brings a bug to the program

这个例子简单明了,但是对于某些其他情况,当一个方法声明了一堆符合单一类型的原始类型参数时,程序的不需要的行为可能不那么容易理解,因此会检测到参数混淆。

内联类有助于此:

inline class Width(val value: Int)
inline class Height(val value: Int)

interface ResizeableView {
    fun resize(width: Width, height: Height)
}

因为WidthHeight现在是不同的类型,所以在调用该方法时会混淆。

val width: Width = someObject.width
val height: Height = someObject.height
resizeableView.resize(height, width) //compile-time error

但是inline修饰符在这里有什么意义呢?为什么不使用class Width?关键是inline classes仅在编译类型中引入类型,并且在运行时这些变量将只是int-s,因此不会创建运行时开销。

qazxsw poi是一个很好的在线课程应用的真实世界的例子。


0
投票

内联类为我们提供了一种包装类型的方法,从而添加了功能并自行创建了一个新类型。

与常规(非内联)包装器相反,它们将受益于改进的性能。发生这种情况是因为数据内联到其用法中,并且在生成的编译代码中跳过了对象实例化。

你可以在Here上看到一个很好的例子


0
投票

除了this的回答,我想补充更多细节。

内联类被编译代码中的底层值替换,使其更具性能。但为什么?

值存储在堆栈或JVM中的堆中。对于Heap的常规对象,但Heap上的分配和内存提取比Stack慢。通过用其底层值替换类,JVM将能够将它存储在Stack上,因此内联类比常规类更快。

但并非总是如此。

编译器不够智能,无法用其基础值替换每个内联类。

内联类在用作另一种类型时会被装箱。当静态地知道值为内联类时,将使用未装箱的内联类。

您应该在@Andrey Ilyunin中阅读更多内容,以了解内联类何时可以由其基础值表示。当在编译代码中实际内联值时,内联类只会变得更快。

© www.soinside.com 2019 - 2024. All rights reserved.