Kotlin内联类 - 它们如何工作以及何时应该使用它们

时间:2019-08-28 来源:www.zsbohai.com

  Kotlin引入了1.3版本的内联类作为实验性功能。您应该知道它们的实现在将来的版本中仍然可以更改,但现在已经是了解它们的好时机。内联类添加了一个简单的工具,我们可以使用它来包装其他类型,而无需通过额外的堆分配添加运行时开销。在本文中,我们希望了解Kotlin中的内联类如何工作以及何时使用它们是有意义的。

  在项目中启用内联类

  要在项目中启用内联类,只需使用Kotlin版本> 1.3,inline即将关键字添加到语言中。由于内联类仍处于试验阶段,因此当您使用它们时,IDE将显示相关警告。可以使用此处所述的显式编译器标志禁用警告。

  第一眼内联课程

  内联类非常简单。要使类内联,只需将inline关键字添加到您的类:

  inline class WrappedInt(val value: Int)

  内联类有一些或多或少明显的限制:需要在主构造函数中精确指定一个属性,如图所示value。您不能在一个inline类中包装多个值。它也被禁止init在内联类中使用块,并且您不能拥有带有支持字段的属性。但是,内联类可以具有简单的可计算属性,我们将在本文后面看到。

  在运行时,只要有可能,就会使用内联类的包装类型而不使用其包装器。这类似于Java的盒装类型,Integer或者Boolean,只要编译器可以这样做,它就会表示为相应的基本类型。这正是Kotlin内联类的最大卖点:当你内联一个类时,除非绝对必要,否则类本身不会用在字节代码中。内联类大大减少了运行时的空间开销。

  运行时表示

  在运行时,内联类可以表示为包装类型和基础类型。如前一段所述,编译器更喜欢使用类的底层(包装)类型inline来尽可能地优化代码。这是类似之间拳击int和Integer。但是,在某些情况下,编译器需要使用包装器本身,因此它将在编译期间生成:

  public final class WrappedInt{

  private final int value;

  public final int getValue(){ return this.value; }

  // $FF: synthetic method

  private WrappedInt(int value){ this.value = value; }

  public static int constructor_impl(int value){ return value; }

  // $FF: synthetic method