浅谈Kotlin(七):lateinit、by lazy 使用
Kotlin中有兩種延遲初始化的方式。一種是lateinit var,一種是by lazy。
一、lateinit的使用
按Java的寫法,此時(shí)即代表datas默認(rèn)為null,但是因?yàn)镵otlin的非空機(jī)制,這里給出了兩種選擇,要不給一個(gè)初始值,要不增加lateInit修飾
則可以這么寫:
表示初始即為null
var datas:ArrayList<String> ? =null
改寫法需要在后面使用的時(shí)候進(jìn)行非空判斷:
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>? */
也可以這么寫:
表示我先不給一個(gè)初始值,編譯期的時(shí)候也無需進(jìn)行非空判斷,后面我會(huì)找時(shí)機(jī)給他賦值
即late的作用為編譯期在檢查時(shí)不要因?yàn)閷傩宰兞课幢怀跏蓟鴪?bào)錯(cuò)
lateinit var datas:ArrayList<String>
當(dāng)然若在使用該變量的時(shí)候仍未給賦值,則會(huì)報(bào)錯(cuò)
Caused by: kotlin.UninitializedPropertyAccessException: lateinit property datas has not been initialized
lateinit使用限制:
只能用來修飾類屬性,不能用來修飾局部變量,
只能用來修飾對(duì)象,不能用來修飾基本類型(因?yàn)榛绢愋偷膶傩栽陬惣虞d后的準(zhǔn)備階段都會(huì)被初始化為默認(rèn)值)。
二、by lazy的使用
用法即先不進(jìn)行初始化操作,直到第一次使用的時(shí)候再進(jìn)行初始化
val lazyParm: String by lazy {
Log.i(Tag,"lazyParm初始化");
"aaa"
}
Log.i(Tag,"lazyParm->"+lazyParm);
如上,先進(jìn)行聲明lazyParm屬性,直到后面執(zhí)行到Log操作用到了lazyParm時(shí)再進(jìn)行初始化
打印結(jié)果: lazyParm初始化 lazyParm->aaa
by lazy使用限制:
要求屬性聲明為val,即不可變變量,在java中相當(dāng)于被final修飾。
可以使用于類屬性或者局部變量。
作者:聽著music睡
出處:http://www.cnblogs.com/xqxacm/
Android交流群:38197636
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
總結(jié)
以上是生活随笔為你收集整理的浅谈Kotlin(七):lateinit、by lazy 使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 6.0:Expression –
- 下一篇: POJ 1228 Grandpa's E