Kotlin中的内联类是什么?

时间:2019-04-11 06:25:55

标签: android kotlin

内联类:Inline classes

我想知道内联与Kotlin中其他类的内联之间的确切区别是什么?我想知道什么是确切的内联类,什么时候使用?

3 个答案:

答案 0 :(得分: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,因此不会创建运行时开销。

Here是内联类应用程序的一个很好的真实示例。

答案 1 :(得分:0)

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

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

您可以在this

上看到一个很好的例子

答案 2 :(得分:0)

除了@Andrey Ilyunin的答案外,我想添加更多详细信息。

将内联类替换为已编译代码中的基础值,以使其性能更高。但是为什么呢?

值存储在JVM的堆栈或堆中。对于作为堆的常规对象,但是堆上的分配和内存获取比堆栈慢。通过用其基础值替换一个类,JVM将能够将其存储在堆栈中,因此内联类比常规类要快。

但这并不总是正确的。

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

  当

inline类用作另一种类型时,将被装箱。当静态将值称为内联类时,使用未装箱的内联类。

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