簡體   English   中英

Kotlin - lateinit VS Any? = null

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM