Kotlin学习(一):lateinit vs lazy

作为Google的亲儿子,kotlin开发Android应用具有工具多样,上手容易等优势。从语言发展的角度来看,kotlin可以称作为程序员设计的语言。基本语法大家可以去官方文档看,这里我们讨论一些需要注意的地方。
lateinit vs lazy

Kotlin中有很多优秀的特性,我们可以利用这些特性在Kotlin中编写更好的应用程序。在这些特性中,lateinit和lazy是重要的属性初始化特性。我们必须知道何时使用哪个属性初始化。

Kotlin Property Initialization

如果不想在构造函数中初始化属性,那么这里有两个重要方法可以完成初始化属性。

  • lateinit
  • lazy
lateinit

lateinit是延迟初始化。

通常,声明为具有非空类型的属性必须在构造函数中初始化。然而,这通常并不方便。例如,我想通过依赖注入或在单元测试的设置方法中进行初始化操作。在这种情况下,我不能在构造函数中直接初始化这些属性,但如果我这么做了,在方法体内引用到这些属性变量时,编译器会给我报错。

为了解决这种问题,你可以给属性标记lateinit字段。

Example
1
2
3
4
5
6
7
8
9
10
11
12
public class Test {

lateinit var mock: Mock

@SetUp fun setup() {
mock = Mock()
}

@Test fun test() {
mock.do()
}
}

但是这个修饰符只能用在类主体(而不是在主构造函数中)内声明的var属性,并且只能在该属性没有自定义getter或setter时使用。属性的类型必须为非空,并且不能是基元类型。

lazy

lazy是惰性初始化。

lazy()是一个接受lambda并返回lazy实例的函数,该实例可以作为实现lazy属性的委托:get()的第一个调用执行传递给lazy()的lambda并记住结果,get()的后续调用只返回记住的结果。

Example
1
2
3
public class Example{
val name: String by lazy { “Amit Shekhar” }
}

所以第一次和随后的调用,name会返回“Amit Shekhar”

如何选择何时使用哪一个?
  • lazy只能用于val属性,而lateinit只能应用于vars,因为它不能编译为最终字段,因此不能保证不变性。
  • lateinit变量可以从任何能看到对象的地方初始化。如果您希望您的属性以一种事先未知的方式从外部初始化,请使用lateinit。
龙颜大悦,朕要赏赐!