作为Google的亲儿子,kotlin开发Android应用具有工具多样,上手容易等优势。从语言发展的角度来看,kotlin可以称作为程序员设计的语言。基本语法大家可以去官方文档看,这里我们讨论一些需要注意的地方。
lateinit vs lazy
Kotlin中有很多优秀的特性,我们可以利用这些特性在Kotlin中编写更好的应用程序。在这些特性中,lateinit和lazy是重要的属性初始化特性。我们必须知道何时使用哪个属性初始化。
Kotlin Property Initialization
如果不想在构造函数中初始化属性,那么这里有两个重要方法可以完成初始化属性。
- lateinit
- lazy
lateinit
lateinit是延迟初始化。
通常,声明为具有非空类型的属性必须在构造函数中初始化。然而,这通常并不方便。例如,我想通过依赖注入或在单元测试的设置方法中进行初始化操作。在这种情况下,我不能在构造函数中直接初始化这些属性,但如果我这么做了,在方法体内引用到这些属性变量时,编译器会给我报错。
为了解决这种问题,你可以给属性标记lateinit字段。
Example
1 | public class Test { |
但是这个修饰符只能用在类主体(而不是在主构造函数中)内声明的var属性,并且只能在该属性没有自定义getter或setter时使用。属性的类型必须为非空,并且不能是基元类型。
lazy
lazy是惰性初始化。
lazy()是一个接受lambda并返回lazy实例的函数,该实例可以作为实现lazy属性的委托:get()的第一个调用执行传递给lazy()的lambda并记住结果,get()的后续调用只返回记住的结果。
Example
1 | public class Example{ |
所以第一次和随后的调用,name会返回“Amit Shekhar”
如何选择何时使用哪一个?
- lazy只能用于val属性,而lateinit只能应用于vars,因为它不能编译为最终字段,因此不能保证不变性。
- lateinit变量可以从任何能看到对象的地方初始化。如果您希望您的属性以一种事先未知的方式从外部初始化,请使用lateinit。