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
修飾。
可以使用於類屬性或者局部變量。