[英]Kotlin - lateinit VS Any? = null
在Kotlin中,似乎有兩種方法在對象內聲明一個變量,該變量可以為null並在創建對象后實例化。
var myObject : Any? = null
要么
var lateinit myObject : Any
我很困惑為什么我們可以讓var可以為空並在以后分配它時需要lateinit關鍵字。 每種方法的優缺點是什么?在每種方法中應該使用哪種方法?
以下是根據我目前在Kotlin的知識看到的差異。
第一:
var myObject1 : Any? = null
這里myObject1
是一個可以為空的屬性。 這意味着您可以為其分配null
。
第二個:
lateinit var myObject2 : Any
這里myObject2
是一個非null屬性。 這意味着你不能為它分配null
。 通常,如果屬性為非null,則必須在聲明處初始化它。 但添加關鍵字lateinit
允許您推遲初始化。 如果在初始化之前嘗試訪問lateinit
屬性,則會出現異常。
簡而言之,主要區別在於myObject1
是可空的,而myObject2
是非空的。 關鍵字lateinit
為您提供了一種便利機制,允許在以后初始化非null屬性,而不是在聲明中初始化它。
有關詳細信息,請檢查此
lateinit
關鍵字用於字段,以avoid
在引用對象內部的字段時進行空檢查。 當您使用依賴注入初始化變量或在單元測試的setup方法中初始化變量時,主要使用關鍵字
?
當字段將在程序中稍后通過setter或對象的方法內部初始化時,在字段上使用,這是為了強制您在引用字段時檢查null或使用null安全性( ?.
)
如果你的屬性不應該是null
,但是在將來某個點之后沒有設置,那么使用lateinit
關鍵字聲明它是更安全的。 這保證了,如果你在設置它之前訪問它,你會得到一個例外來解釋它。
傳統的Java方法是拋出一個通用的NullPointerException
而不解釋它。 如果您自己編寫代碼,可能會有一些線索,但如果其他人捕獲到錯誤,則不清楚為什么該特定變量為null
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.