lazy:延遲加載
1鞋喇、 lazy提供了初始化的方法嗡官,不過真正初始化這個動作發(fā)生的時機卻是在第一次被使用時。
2壁肋、 lazy()是一個函數(shù), 可接受一個Lambda表達式作為參數(shù),第一次調(diào)用將會執(zhí)行 Lambda 表達式,以后調(diào)用該參數(shù)返回以前記住的結果.
3、 可以理解為lazy{…}函數(shù)的最后一行為返回值
4萍嬉、 lazy只能實現(xiàn)對屬性為val的初始化幅垮,對于var需要用lateinit
5腰池、 lateinit的使用有很多限制的,比如只能在不可null的對象上使用忙芒,不能為primitives(Int巩螃、Float之類)等等
延遲初始化屬性與變量
一般地,屬性聲明為非空類型必須在構造函數(shù)中初始化匕争。 然而避乏,這經(jīng)常不方便。
例如:屬性可以通過依賴注入來初始化甘桑, 或者在單元測試的 setup 方法中初始化拍皮。
這種情況下歹叮,你不能在構造函數(shù)內(nèi)提供一個非空初始器。但你仍然想在類體中引用該屬性時避免空檢查铆帽。
為處理這種情況咆耿,你可以用 lateinit 修飾符標記該屬性:
public class MyTest {
lateinit var subject: TestSubject
@SetUp fun setup() {
subject = TestSubject()
}
@Test fun test() {
subject.method() // 直接解引用
}
}
該修飾符只能用于在類體中的屬性(不是在主構造函數(shù)中聲明的 var 屬性,并且僅當該屬性沒有自定義 getter 或 setter 時)爹橱,而自 Kotlin 1.2 起萨螺,也用于頂層屬性與局部變量。該屬性或變量必須為非空類型愧驱,并且不能是原生類型慰技。
在初始化前訪問一個 lateinit 屬性會拋出一個特定異常,該異常明確標識該屬性被訪問及它沒有初始化的事實组砚。
檢測一個 lateinit var 是否已初始化(自 1.2 起)
要檢測一個 lateinit var 是否已經(jīng)初始化過吻商,請在該屬性的引用上使用 .isInitialized:
if (foo::bar.isInitialized) {
println(foo.bar)
}
此檢測僅對可詞法級訪問的屬性可用,即聲明位于同一個類型內(nèi)糟红、位于其中一個外圍類型中或者位于相同文件的頂層的屬性艾帐。