首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delegates.notNull与后发Kotlin的区别

Delegates.notNull与后发Kotlin的区别
EN

Stack Overflow用户
提问于 2017-05-26 15:39:05
回答 2查看 11.1K关注 0票数 53

我非常困惑,两者的外观和工作非常相似。我该选哪一个?

代码语言:javascript
复制
private var mMediaController by Delegates.notNull<MediaControllerCompat>()

代码语言:javascript
复制
lateinit private var mMediaController: MediaControllerCompat

用法:

代码语言:javascript
复制
    @Subscribe
    fun connectToSession(token: MediaSessionCompat.Token) {
         mMediaController = MediaControllerCompat(activity, token)
         mMediaController.registerCallback(mMediaControllerCallback)
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-26 16:20:33

这两种型号相似,其中一种早于另一种。Delegates.notNull() (api参考)是基于委托属性的,是最初的,后来又出现了lateinit (迟初始化属性)。这两种方法都不涵盖所有可能的用例,除非您可以控制类的生命周期,并且确定在使用之前将对它们进行初始化,否则这两种情况都不应该使用。

如果后台字段可能是直接设置的,或者您的库不能使用委托,那么您应该使用lateinit,而且在使用依赖项注入时,这通常是大多数人的默认情况。从医生那里

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

如果lateinit不支持所使用的类型(不支持原始类型),则强制使用委托。

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

您可能还想阅读讨论主题"https://discuss.kotlinlang.org/t/improving-lateinit/1843/3“。

票数 49
EN

Stack Overflow用户

发布于 2017-05-26 17:39:24

  • notNull为每个属性创建一个额外的对象。
  • 这个对象很小,但是如果您有很多属性,那么它对您来说是非常重要的。
  • 不能将notNull委托与直接注入到Java字段的外部注入工具一起使用;
  • 不能创建基本类型(Int、Long等)的lateinit属性。
  • 延迟比较便宜,但只有在属性具有基本类型时才能使用委托。

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

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44205389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档