Kotlin中lateinit和by lazy的区别

lateinit和by lazy都是Kotlin中用来延迟初始化属性的关键字,但是它们有一些明显的不同之处。

lateinit是用于非空属性的延迟初始化。在使用lateinit时,需要在声明属性时使用关键字“lateinit”以及“var”关键字来声明可变属性。它可以在属性生命周期中的任何时刻进行初始化,并且只能用于非空属性。一旦使用lateinit修饰的属性被初始化之后,它就不能再次被赋为null值。
下面是一个使用lateinit的示例:

class MyClass {
    lateinit var myProperty: String
    
    fun initialize() {
        myProperty = "Initialized"
    }
    
    fun printProperty() {
        if (::myProperty.isInitialized) {
            println(myProperty)
        } else {
            println("Property is not initialized")
        }
    }
}

fun main() {
    val obj = MyClass()
    obj.printProperty() // Output: Property is not initialized
    obj.initialize()
    obj.printProperty() // Output: Initialized
}

by lazy是用于只读属性的延迟初始化。在使用by lazy时,属性必须是val(不可变)。它在第一次访问属性时进行初始化,并且只会进行一次初始化。by lazy还可以指定一个初始化函数,该函数会返回属性的值。在多线程环境中使用by lazy时,它会确保只有一个线程对属性进行初始化。

下面是一个使用by lazy的示例:

class MyClass {
    val myProperty: String by lazy {
        "Initialized"
    }
    
    fun printProperty() {
        println(myProperty)
    }
}

fun main() {
    val obj = MyClass()
    obj.printProperty() // Output: Initialized
}

可以看到,lateinit和by lazy的区别在于:

  • lateinit可以用于可变属性,而by lazy只能用于不可变属性。
  • lateinit可以在任何时候初始化属性,而by lazy只有在首次访问属性时才会进行初始化。
  • lateinit的属性只能进行一次初始化,并不能被赋为null值,而by lazy的属性只在第一次访问时进行初始化,并且可以保持不变。
  • 在多线程环境中,by lazy可以确保只有一个线程对属性进行初始化,而lateinit则没有这样的保证。
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值