实例说明kotlin关键字by和by lazy的用法

2025-03-04 11:18 实例说明kotlin关键字by和by lazy的用法已关闭评论

在 Kotlin 中,by 是一个用于属性委托的关键字,它允许将属性的 getter 和 setter 逻辑委托给另一个对象处理。而 by lazy 则是 by 的一种特定用法,用来实现懒加载(lazy initialization)属性。下面我将详细解释这两个关键字,并提供具体的代码示例来说明它们的用法。

by 关键字

by 关键字用于属性委托,它可以将属性的行为委托给实现了特定接口的对象。常见的场景包括懒加载、观察属性变化、存储属性到映射中等。Kotlin 标准库提供了几种内置的委托,如 lazyobservablevetoable 等。

自定义委托示例:

class Delegate {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "$thisRef, thank you for delegating '${property.name}' to me!"
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$value has been assigned to '${property.name} in $thisRef.'")
    }
}

class Example {
    var p: String by Delegate()
}

fun main() {
    val e = Example()
    println(e.p) // 输出: Example@..., thank you for delegating 'p' to me!
    e.p = "NEW VALUE" // 输出: NEW VALUE has been assigned to 'p in Example@....'
}

在这个例子中,Example 类中的 p 属性被委托给了 Delegate 类实例。每次访问或设置 p 属性时,都会调用 Delegate 类中的相应方法。

by lazy 关键字

by lazyby 的一种特定形式,它专门用于懒加载属性。这意味着只有在首次访问该属性时才会执行初始化逻辑,并且一旦初始化完成,后续的访问将直接使用缓存的值。这在需要延迟初始化资源或者计算开销较大的情况下特别有用。

by lazy 示例:

val data: String by lazy {
    println("Initializing data...")
    // 模拟耗时操作
    Thread.sleep(1000)
    "Initialized Data"
}

fun main() {
    println("Before accessing 'data'.")
    println(data) // 第一次访问触发初始化逻辑
    println(data) // 后续访问直接返回缓存的值
}

在这个例子中,data 属性直到第一次被访问时才会打印“Initializing data...”并模拟一个耗时操作,之后的所有访问都会直接返回之前缓存的数据,而不会再执行初始化逻辑。

结合 byby lazy 的实际应用

假设我们有一个应用程序,其中包含一个需要从网络加载的用户配置文件。我们可以使用 by lazy 来确保这个配置文件仅在首次访问时加载,并且只加载一次:

class UserProfile {

    // 使用 by lazy 实现懒加载
    val profileData: String by lazy {
        println("Loading user profile from network...")
        loadUserProfileFromNetwork()
    }

    private fun loadUserProfileFromNetwork(): String {
        // 模拟网络请求
        Thread.sleep(1000)
        return "User Profile Data"
    }

    fun displayProfile() {
        println(profileData)
    }
}

fun main() {
    val userProfile = UserProfile()

    // 此时不会加载用户资料
    println("Before accessing 'profileData'.")

    // 首次访问 'profileData' 属性时,会触发初始化逻辑
    userProfile.displayProfile() // 输出: Loading user profile from network... User Profile Data

    // 再次访问 'profileData' 属性,直接返回缓存的值
    userProfile.displayProfile() // 输出: User Profile Data
}

总结

  • by:用于属性委托,可以将属性的行为委托给实现了特定接口的对象。
  • by lazy:是 by 的一种特定形式,用于实现懒加载属性,确保属性仅在首次访问时初始化,并且只初始化一次。

通过合理地使用 byby lazy,可以使代码更加简洁、高效,并减少不必要的资源消耗。此外,属性委托还可以帮助实现更复杂的功能,例如属性变化监听、持久化属性值等。

当前文章价值2.56元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

你可能感兴趣的文章

来源:每日教程每日一例,深入学习实用技术教程,关注公众号TeachCourse
转载请注明出处: https://teachcourse.cn/3758.html ,谢谢支持!

资源分享

分类:kotlin 标签:,
004-ubuntu服务器给wordpress站点开启https详细配置 004-ubuntu服务器给wordpress站点
Android开发之深入理解Android 7.0系统权限更改相关文档 Android开发之深入理解Android
Ubuntu系统Use a production WSGI server instead Ubuntu系统Use a production W
一天教你熟悉掌握Android Studio开发Android Project 一天教你熟悉掌握Android Stud

评论已关闭!