淺談Kotlin(七):lateinit、by lazy 使用


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修飾。

可以使用於類屬性或者局部變量。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM