Delegates.notNull和lateinit Kotlin之间的差异

Delegates.notNull和lateinit Kotlin之间的差异,kotlin,Kotlin,我很困惑这两个外观和作品都非常相似。我该选哪一个 private var mMediaController by Delegates.notNull<MediaControllerCompat>() 用法: @Subscribe fun connectToSession(token: MediaSessionCompat.Token) { mMediaController = MediaControllerCompat(activity, toke

我很困惑这两个外观和作品都非常相似。我该选哪一个

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

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

这两个模型相似,一个比另一个早
Delegates.notNull()
()是基于并且是原始的,后来出现了
lateinit
()。这两种方法都不涵盖所有可能的用例,也不应该使用这两种方法,除非您可以控制类的生命周期,并且确信它们在使用之前将被初始化

如果支持字段可能是直接设置的,或者您的库无法与委托一起使用,那么您应该使用
lateinit
,并且通常它是大多数人在使用依赖项注入时的默认值:

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

如果您正在使用的类型不受
lateinit
支持(不支持基元类型),则将强制您使用委托

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

您可能还想阅读讨论主题“.”

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

  • 对象很小,但是如果有很多属性,它可以是 对你来说意义重大

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

  • 不能创建基元类型(Int、Long等)的lateinit属性

  • lateinit比较便宜,但是当属性具有基元类型时,只能使用委托


来源:

这个问题没有标记为已结束,除了当前的答案之外,还需要其他什么吗?
    @Subscribe
    fun connectToSession(token: MediaSessionCompat.Token) {
         mMediaController = MediaControllerCompat(activity, token)
         mMediaController.registerCallback(mMediaControllerCallback)
    }