Android_Question icon indicating copy to clipboard operation
Android_Question copied to clipboard

kotlin中的两种懒加载区别?(by lazy、lateinit)

Open whatshappen opened this issue 6 years ago • 2 comments

whatshappen avatar Apr 17 '19 01:04 whatshappen

by lazy是通过代理模式来实现的,本质上是一个block在第一次返回的时候执行内部代码,之后返回的时候直接返回存储好的结果。lateinit是一个延迟加载的声明,声明稍后会加载这个变量,使用前要先判断一下lateinit声明的对象是否已经加载。

Skiiyis avatar Apr 19 '19 02:04 Skiiyis

lateinit var只能用来修饰类属性,不能用来修饰局部变量,并且只能用来修饰对象,不能用来修饰基本类型(因为基本类型的属性在类加载后的准备阶段都会被初始化为默认值)。 by lazy要求属性声明为val,即不可变变量,在java中相当于被final修饰。这意味着该变量一旦初始化后就不允许再被修改值了(基本类型是值不能被修改,对象类型是引用不能被修改)。{}内的操作就是返回唯一一次初始化的结果。

whatshappen avatar Apr 22 '19 06:04 whatshappen