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查看更多精彩文章!

目录
相关文章
|
9天前
|
安全 Android开发 Kotlin
Android经典实战之SurfaceView原理和实践
本文介绍了 `SurfaceView` 这一强大的 UI 组件,尤其适合高性能绘制任务,如视频播放和游戏。文章详细讲解了 `SurfaceView` 的原理、与 `Surface` 类的关系及其实现示例,并强调了使用时需注意的线程安全、生命周期管理和性能优化等问题。
40 7
|
5天前
|
编解码 前端开发 Android开发
Android经典实战之TextureView原理和高级用法
本文介绍了 `TextureView` 的原理和特点,包括其硬件加速渲染的优势及与其他视图叠加使用的灵活性,并提供了视频播放和自定义绘制的示例代码。通过合理管理生命周期和资源,`TextureView` 可实现高效流畅的图形和视频渲染。
36 12
|
4天前
|
安全 Android开发 开发者
探索安卓开发的未来:Kotlin的崛起与Flutter的挑战
在移动开发的广阔天地中,安卓平台始终占据着举足轻重的地位。随着技术的不断进步和开发者需求的多样化,Kotlin和Flutter成为了改变游戏规则的新玩家。本文将深入探讨Kotlin如何以其现代化的特性赢得开发者的青睐,以及Flutter凭借跨平台的能力如何挑战传统的安卓开发模式。通过实际案例分析,我们将揭示这两种技术如何塑造未来的安卓应用开发。
23 6
|
5天前
|
安全 Java Android开发
探索安卓应用开发的新趋势:Kotlin和Jetpack Compose
在安卓应用开发领域,随着技术的不断进步,新的编程语言和框架层出不穷。Kotlin作为一种现代的编程语言,因其简洁性和高效性正逐渐取代Java成为安卓开发的首选语言。同时,Jetpack Compose作为一个新的UI工具包,提供了一种声明式的UI设计方法,使得界面编写更加直观和灵活。本文将深入探讨Kotlin和Jetpack Compose的特点、优势以及如何结合使用它们来构建现代化的安卓应用。
15 4
|
9天前
|
Android开发 容器
Android经典实战之如何获取View和ViewGroup的中心点
本文介绍了在Android中如何获取`View`和`ViewGroup`的中心点坐标,包括计算相对坐标和屏幕上的绝对坐标,并提供了示例代码。特别注意在视图未完成测量时可能出现的宽高为0的问题及解决方案。
23 7
|
8天前
|
自然语言处理 Java 网络架构
解锁跨平台微服务新纪元:Micronaut与Kotlin联袂打造的多语言兼容服务——代码、教程、实战一次打包奉送!
【9月更文挑战第6天】Micronaut是一款轻量级、高性能的Java框架,适用于微服务开发。它支持Java、Groovy和Kotlin等多种语言,提供灵活的多语言开发环境。本文通过创建一个简单的多语言兼容服务,展示如何使用Micronaut及其注解驱动特性实现REST接口,并引入国际化支持。无论是个人项目还是企业应用,Micronaut都能提供高效、一致的开发体验,成为跨平台开发的利器。通过简单的配置和代码编写,即可实现多语言支持,展现其强大的跨平台优势。
22 2
|
12天前
|
调度 Android开发 UED
Android经典实战之Android 14前台服务适配
本文介绍了在Android 14中适配前台服务的关键步骤与最佳实践,包括指定服务类型、请求权限、优化用户体验及使用WorkManager等。通过遵循这些指南,确保应用在新系统上顺畅运行并提升用户体验。
25 6
|
10天前
|
Android开发
Android经典实战之Textview文字设置不同颜色、下划线、加粗、超链接等效果
本文介绍了 `SpannableString` 在 Android 开发中的强大功能,包括如何在单个字符串中应用多种样式,如颜色、字体大小、风格等,并提供了详细代码示例,展示如何设置文本颜色、添加点击事件等,助你实现丰富文本效果。
49 3
|
10天前
|
Android开发 UED 开发者
Android经典实战之WindowManager和创建系统悬浮窗
本文详细介绍了Android系统服务`WindowManager`,包括其主要功能和工作原理,并提供了创建系统悬浮窗的完整步骤。通过示例代码,展示了如何添加权限、请求权限、实现悬浮窗口及最佳实践,帮助开发者轻松掌握悬浮窗开发技巧。
26 1
|
11天前
|
API Android开发 数据安全/隐私保护
Android经典实战之窗口和WindowManager
本文介绍了Android开发中“窗口”的基本概念及其重要性。窗口是承载用户界面的基础单位,而`WindowManager`系统服务则负责窗口的创建、更新和移除等操作。了解这些概念有助于开发复杂且用户体验良好的应用。
14 2