我非常困惑,两者的外观和工作非常相似。我该选哪一个?
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)
}发布于 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“。
发布于 2017-05-26 17:39:24
来源:https://discuss.kotlinlang.org/t/notnull-delegate-vs-lateinit/1923/2
https://stackoverflow.com/questions/44205389
复制相似问题