Delegates.notNull和lateinit Kotlin之间的区别

时间:2017-05-26 15:39:05

标签: 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)
    }

2 个答案:

答案 0 :(得分:21)

两个模型相似,一个模型早于另一模型。 Delegates.notNull()api reference)基于delegated properties,是原始版本,后来lateinitLate Initialized Properties)。既不覆盖所有可能的用例,也不应该使用它们,除非您可以控制类的生命周期并确保它们在使用之前将被初始化。

如果可以直接设置支持字段,或者您的库无法使用委托,那么您应该使用lateinit,并且通常在使用依赖注入时大多数人都是默认设置。 From the docs

  

通常,声明为具有非null类型的属性必须在构造函数中初始化。但是,这通常不方便。例如,可以通过依赖注入或单元测试的设置方法初始化属性。在这种情况下,您不能在构造函数中提供非null初始值设定项,但是在引用类体内的属性时仍然希望避免空值检查。

如果lateinit不支持您使用的类型(不支持基本类型),则会强制您使用该委托。

  

(lateinit)修饰符只能用于在类体内声明的var属性(不在主构造函数中),并且只能在属性没有自定义getter或setter时使用。属性的类型必须为非null,并且它不能是基本类型。

您可能还想阅读讨论主题“ Improving lateinit ”。

答案 1 :(得分:12)

  • notNull为每个属性创建一个额外的对象。

  • 对象很小,但如果你有很多属性,那就可以了 对你很重要。

  • 您不能将notNull委托与外部注入工具一起使用 直接注入Java字段;

  • 您无法创建基本类型(Int,Long等)的lateinit属性。

  • lateinit更便宜,但是当你的属性具有原始类型时,你只能使用委托。

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