Android经典实战之Kotlin委托模式和by关键字

简介: 本文介绍了Kotlin中`by`关键字在类及属性委托中的运用,通过实例展示了如何利用类委托简化接口实现,以及如何借助标准与自定义属性委托管理属性的读写操作。通过`by`关键字的支持,Kotlin使得委托模式的实现更为直观且高效。

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

在 Kotlin 中,关键字 by 主要用于委托(Delegation)模式。委托是一种设计模式,可以把一个类的某些职责委托给另一个类来处理。Kotlin 提供了对委托的直接支持,使它在类和属性中使用起来更加简洁和直观。

委托模式简介

在经典的委托模式中,一个类将它的一些行为通过对象组合的方式委托给另一个对象。Kotlin 通过关键字 by 提供了简单和直接的语法支持,使这种模式更易于实现。

类委托

在 Kotlin 中,可以使用 by 关键字来实现类委托。假设你有一个接口 Base,它定义了一些行为:

interface Base {
    fun printMessage()
    fun printAnotherMessage()
}

class BaseImpl : Base {
    override fun printMessage() {
        println("BaseImpl: printMessage")
    }

    override fun printAnotherMessage() {
        println("BaseImpl: printAnotherMessage")
    }
}

现在,你想创建一个类 Derived,它实现 Base 接口,但不想重新实现接口中的方法,而是将这些方法委托给 BaseImpl 类:

class Derived(b: Base) : Base by b

你可以这样使用:

fun main() {
    val base = BaseImpl()
    val derived = Derived(base)
    derived.printMessage() // 输出 BaseImpl: printMessage
    derived.printAnotherMessage() // 输出 BaseImpl: printAnotherMessage
}

在这段代码中,Derived 类实现了 Base 接口,并将所有接口中的方法调用委托给了传入的 Base 实例。

属性委托

除了类委托,Kotlin 还支持属性委托。属性委托允许你将属性的 get 和 set 方法委托给另一个对象来处理。

标准委托

Kotlin 标准库提供了一些常用的属性委托,可以直接使用,如 lazyobservablevetoable

val lazyValue: String by lazy {
    println("Computed!")
    "Hello"
}

fun main() {
    println(lazyValue)  // 输出 Computed! 然后输出 Hello
    println(lazyValue)  // 直接输出 Hello,不再触发计算
}

自定义属性委托

你也可以创建自己的属性委托。自定义委托需要实现 ReadOnlyPropertyReadWriteProperty 接口。

例如,一个简单的委托类:

import kotlin.reflect.KProperty

class ExampleDelegate {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "Delegate value for '${property.name}'"
    }

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

class MyClass {
    var attribute: String by ExampleDelegate()
}

fun main() {
    val myClass = MyClass()
    println(myClass.attribute)  // 输出 Delegate value for 'attribute'
    myClass.attribute = "New Value"  // 输出 Delegate value 'New Value' assigned to 'attribute'
}

在这个示例中,ExampleDelegate 类实现了 getValuesetValue 操作符函数,这使得它可以用于委托属性。MyClass 中的 attribute 属性的 getter 和 setter 委托给了 ExampleDelegate 对象。

总结

  • 类委托:通过 by 关键字,一个类可以将某些行为委托给另一个类来实现。
  • 属性委托:可以使用标准库中的委托(如 lazyobservable),也可以创建自定义的属性委托。

by 关键字使得委托模式在 Kotlin 中的实现变得更加简洁和直观,大大减少了样板代码的编写。通过了解并应用 by 关键字,可以更好地设计并编写高可维护性的 Kotlin 代码。


欢迎关注我的公众号AntDream查看更多精彩文章!

目录
相关文章
|
3月前
|
存储 消息中间件 人工智能
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
123 3
|
2月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
283 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
232 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
571 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
3月前
|
存储 消息中间件 人工智能
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
248 10
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
|
3月前
|
存储 消息中间件 人工智能
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
115 11
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
|
2月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
142 0
|
3月前
|
XML 存储 Java
【06】AI辅助编程完整的安卓二次商业实战-背景布局变更增加背景-二开发现页面跳转逻辑-替换剩余图标-优雅草卓伊凡
【06】AI辅助编程完整的安卓二次商业实战-背景布局变更增加背景-二开发现页面跳转逻辑-替换剩余图标-优雅草卓伊凡
109 3
【06】AI辅助编程完整的安卓二次商业实战-背景布局变更增加背景-二开发现页面跳转逻辑-替换剩余图标-优雅草卓伊凡
|
3月前
|
存储 消息中间件 人工智能
【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
142 4
|
3月前
|
XML 编解码 Android开发
非常经典的Android开发问题-mipmap图标目录和drawable图标目录的区别和适用场景实战举例-优雅草卓伊凡
非常经典的Android开发问题-mipmap图标目录和drawable图标目录的区别和适用场景实战举例-优雅草卓伊凡
219 0
非常经典的Android开发问题-mipmap图标目录和drawable图标目录的区别和适用场景实战举例-优雅草卓伊凡

热门文章

最新文章