大佬教程收集整理的这篇文章主要介绍了kotlin 中最安全的启动,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在使用它们,它们都为 NullPointerException
提供安全性,但 lateinit
会导致 UnInitializedPropetyException
,那么这两个中哪个更安全。什么时候最适合lateinit
,什么时候最适合lazy
?
我试图基于的观点
lateinit
从 NPE 中保存,但它可以抛出 UnInitializedPropetyException
当一个人并不真正需要可变属性时,选择 lazy
不是更好吗?
lateinit
有什么用处?
当 lateinit var abc:Def
可以给 UnInitializedPropetyException
和
var abc:Def?=null
可以给出 NPE
,在这两种情况下我们都有可变性和异常。
它们有两个不同的目的:
by lazy
仅用于在某些时候在运行时访问时初始化某些内容。考虑成本高/资源密集型的组件或初始化。如果此组件仅在某些情况下使用,by lazy
可以帮助避免这些代价高昂的初始化lateinit
如果您不能立即初始化某些内容,则它更像是一种方便的方法。例如。在 android 中,如果您想保存对其中一个视图的引用,则只能在 onCreateView
/onViewCreated
中初始化它们。不幸的是,lateinit
仅适用于 var
,因此它不会强制执行不变性,因此请谨慎使用 :)更新:
使用 lateinit
和可空性模式都会获得可变性和不安全性,因此从这个意义上说,它们并没有太大区别。
但是 lateinit
更冗长,因为您知道如果出现问题是初始化问题(或者应该是)。
可空性模式适用于更一般的问题,例如:如果您计划清除/重置组件
lazy
是最安全的,因为您需要先为其分配一个值,而不必担心初始状态。另外,关于资源,当第一次使用lazy
对象时,它被初始化。关于性能,当你先调用 get() 然后每次调用 get() 从内存中给出结果时,结果会保存在内存中。
关于最好的情况,使用它们 late init
和 lazy
late init
在不确定对象的方式时使用
初始化和可变性lazy
使用以防万一,您希望类中只存在实例对象
范围和不变性什么时候使用哪个?
lateinit 只能用于 var(可变)属性,而 lazy 只能用于 val(不可变)属性。 lateinit 不适用于原始类型。 在使用单例模式(Kotlin 中的对象声明)时,我们应该使用惰性,因为它会在第一次使用时被初始化。 在 lateinit 中,属性的类型必须是非空的。 lateinit 只能在属性没有自定义 getter 或 setter 时使用。 在 lateinit var 中,它取决于用户在多线程环境中正确初始化属性。通过 lazy { ... } 初始化默认是线程安全的,并确保初始化最多完成一次。
var — Declared as mutable
val — Read-only (immutablE)
val someText: String by lazy { "Variable is lazy initialized" }
fun doprintSomeText() {
println("Length is " + someText.length) // someText will be initialized here
}
lateinit var someText: String // initialize laterfun doprintSomeText() {
someText = "Variable is lateinit" // initialize
println("Length is " + someText.length)
}
您可以在使用前检查 lateinit
var 是否已初始化
lateinit var foo: Foo
if(::foo.isInitialized) {
// foo is initialized. Go Ahead
}
当您知道 var 将需要但在类加载时不需要时,您可以使用 lateinit
声明它。这意味着您将根据需要对其进行初始化。
懒惰表示该变量将在第一次使用时进行初始化。如果您不需要使用该变量,则它根本不会初始化。
这不会以任何方式导致 NPE。
简而言之,如果我们将其声明为 lateinit
,那么作为开发人员,我们完全有责任在使用前对其进行初始化
以上是大佬教程为你收集整理的kotlin 中最安全的启动全部内容,希望文章能够帮你解决kotlin 中最安全的启动所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。