2016-02-29 28 views
12

在Kotlin中似乎有兩種方法在對象內部聲明一個變量,該變量可以在創建對象之後爲null並實例化。Kotlin - lateinit VS任何? = null

var myObject : Any? = null 

var lateinit myObject : Any 

我感到困惑,爲什麼,如果我們可以只是做了var爲空的,後來分配給需要它的lateinit關鍵字。每種方法的優點和缺點是什麼?每種方法應該在什麼情況下使用?

回答

13

下面是我如何看到根據我目前在Kotlin的知識的差異。

第一招:

var myObject1 : Any? = null 

這裏myObject1是爲空的屬性。這意味着您可以將null分配給它。

第二個:

lateinit var myObject2 : Any 

這裏myObject2是一個非空的屬性。這意味着您不能將null分配給它。通常,如果某個屬性非空,則必須在聲明中對其進行初始化。但添加關鍵字lateinit可讓您推遲初始化。如果您在初始化之前嘗試訪問lateinit屬性,則會發生異常。

總之主要區別在於myObject1是可以爲空並且myObject2是非空值。關鍵字lateinit爲您提供了一種便利機制,允許在以後初始化非空屬性,而不是在聲明中初始化它。

欲瞭解更多信息,請查閱this

4

lateinit關鍵字在字段中使用到avoid當引用對象內部的字段時使用空檢查。當您使用依賴注入來初始化變量或者在單元測試的設置方法中初始化變量時,主要使用關鍵字

?在字段稍後將在程序中初始化時用於字段一個setter或一個方法的內部對象,這是爲了強制你檢查null或使用null安全(?.)當引用該字段時

1

如果你的財產不應該是null,但只是沒有設置後在將來的某個時候,用lateinit關鍵字聲明它更安全。這就保證了,如果你在設置它之前訪問它,你會得到一個異常的解釋。

傳統的Java方法是拋出一個通用的NullPointerException沒有解釋它。如果您自己編寫代碼,您可能會有線索,但如果其他人發現錯誤,則不會清楚爲什麼該特定變量是null

相關問題