标签:初始化 lazy 浅谈 Kotlin lazyParm lateinit 修饰 datas
Kotlin中有两种延迟初始化的方式。一种是lateinit var,一种是by lazy。
一、lateinit的使用
按Java的写法,此时即代表datas默认为null,但是因为Kotlin的非空机制,这里给出了两种选择,要不给一个初始值,要不增加lateInit修饰
则可以这么写:
表示初始即为null
var datas:ArrayList<String> ? =null
改写法需要在后面使用的时候进行非空判断:
datas?.size
否则编译不通过,提示:
Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type kotlin.collections.ArrayList<String>? /* = java.util.ArrayList<String>? */
也可以这么写:
表示我先不给一个初始值,编译期的时候也无需进行非空判断,后面我会找时机给他赋值
即late的作用为编译期在检查时不要因为属性变量未被初始化而报错
lateinit var datas:ArrayList<String>
当然若在使用该变量的时候仍未给赋值,则会报错
Caused by: kotlin.UninitializedPropertyAccessException: lateinit property datas has not been initialized
lateinit使用限制:
只能用来修饰类属性,不能用来修饰局部变量,
只能用来修饰对象,不能用来修饰基本类型(因为基本类型的属性在类加载后的准备阶段都会被初始化为默认值)。
二、by lazy的使用
用法即先不进行初始化操作,直到第一次使用的时候再进行初始化
val lazyParm: String by lazy { Log.i(Tag,"lazyParm初始化"); "aaa" } Log.i(Tag,"lazyParm->"+lazyParm);
如上,先进行声明lazyParm属性,直到后面执行到Log操作用到了lazyParm时再进行初始化
打印结果: lazyParm初始化 lazyParm->aaa
by lazy使用限制:
要求属性声明为val
,即不可变变量,在java中相当于被final
修饰。
可以使用于类属性或者局部变量。
标签:初始化,lazy,浅谈,Kotlin,lazyParm,lateinit,修饰,datas 来源: https://www.cnblogs.com/xqxacm/p/15724611.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。