2017-05-26 167 views
9

我很困惑,兩個外觀和作品非常相似。我應該去哪一個?Delegates.notNull和lateinit Kotlin之間的區別

private var mMediaController by Delegates.notNull<MediaControllerCompat>() 

lateinit private var mMediaController: MediaControllerCompat 

用法:

@Subscribe 
    fun connectToSession(token: MediaSessionCompat.Token) { 
     mMediaController = MediaControllerCompat(activity, token) 
     mMediaController.registerCallback(mMediaControllerCallback) 
    } 
+0

這個問題沒有標記封閉,有什麼別的需要超越目前的答案? –

回答

12

這兩種型號都差不多,和一個早於其他。 Delegates.notNull()api reference)基於delegated properties並且是原始的,後來是lateinitLate Initialized Properties)。既不能涵蓋所有可能的用例,也不應該使用這些用例,除非您可以控制類的生命週期並確定它們在使用之前將被初始化。

如果後臺字段可能是直接設置的,或者您的庫無法與委託一起工作,那麼您應該使用lateinit,通常這是大多數人在使用依賴注入時的默認設置。 From the docs

通常,聲明爲具有非null類型的屬性必須在構造函數中初始化。但是,這通常不方便。例如,可以通過依賴注入或單元測試的設置方法來初始化屬性。在這種情況下,你不能在構造函數中提供一個非null初始值設定項,但是當你引用一個類的正文內的屬性時,你仍然希望避免空的檢查。

如果您使用的類型不受lateinit(不支持基元類型)支持,那麼您將被迫使用委託。

(lateinit)修飾符只能用於在類的主體內聲明的var屬性(不在主構造函數中),並且僅當屬性沒有自定義getter或setter時。屬性的類型必須是非空的,並且不能是原始類型。

你也可能需要閱讀的討論主題爲 「Improving lateinit」。

9
  • notNull爲每個屬性創建一個額外的對象。

  • 該對象很小,但如果您有很多屬性,它可能是 對您很重要。

  • 您不能將notNull委託與 直接注入到Java字段的外部注入工具一起使用;

  • 您不能創建原始類型(Int,Long等)的lateinit屬性。

  • lateinit更便宜,但只有當您的屬性具有原始類型時纔可以使用委託。

來源:https://discuss.kotlinlang.org/t/notnull-delegate-vs-lateinit/1923/2

相關問題