【Kotlin】委托模式
1.【Kotlin】Kotlin环境搭建2.【Kotlin】变量和基本数据类型3.【Kotlin】流程控制4.【Kotlin】函数5.【Kotlin】Lambda表达式6.【Kotlin】类和对象7.【Kotlin】运算符函数、解构函数、中缀函数8.【Kotlin】扩展属性、扩展函数9.【Kotlin】Array简介10.【Kotlin】List、Set、Map简介11.【Kotlin】Sequence简介12.【Kotlin】匿名类和伴生类
13.【Kotlin】委托模式
14.【Kotlin】协程15.【Kotlin】Flow简介16.【Kotlin】Channel简介17.【Kotlin】select简介1 委托模式简介
委托模式的类图结构如下。
对应的 Kotlin 代码如下。
fun main() {
var baseImpl = BaseImpl()
var baseWrapper = BaseWrapper(baseImpl)
baseWrapper.myFun1() // 打印: BaseImpl, myFun1
baseWrapper.myFun2() // 打印: BaseImpl, myFun2
}
interface Base {
fun myFun1()
fun myFun2()
}
class BaseWrapper(var baseImpl: Base): Base {
override fun myFun1() {
baseImpl.myFun1()
}
override fun myFun2() {
baseImpl.myFun2()
}
}
class BaseImpl: Base {
override fun myFun1() {
println("BaseImpl, myFun1")
}
override fun myFun2() {
println("BaseImpl, myFun2")
}
}
2 类委托
Kotlin 可以简化 BaseWrapper,简化后的代码如下。
fun main() {
var baseImpl = BaseImpl()
var baseWrapper = BaseWrapper(baseImpl)
baseWrapper.myFun1() // 打印: BaseImpl, myFun1
baseWrapper.myFun2() // 打印: BaseImpl, myFun2
}
interface Base {
fun myFun1()
fun myFun2()
}
class BaseWrapper(var baseImpl: Base): Base by baseImpl
class BaseImpl: Base {
override fun myFun1() {
println("BaseImpl, myFun1")
}
override fun myFun2() {
println("BaseImpl, myFun2")
}
}
3 属性委托
3.1 by T
import kotlin.reflect.KProperty
fun main() {
var str: String by StringDelegate()
str = "abc"
println(str)
}
class StringDelegate {
var value: String? = null
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
println("getValue, thisRef=$thisRef, name=${property.name}, value=$value")
return value ?: throw IllegalStateException("Property not initialized")
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("setValue, thisRef=$thisRef, name=${property.name}, value=$value")
this.value = value
}
}
打印日志如下。
setValue, thisRef=null, name=str, value=ABC
getValue, thisRef=null, name=str, value=ABC
ABC
3.2 by lazy
fun main() {
// lazy为生成的委托对象, 获取属性时会执行lazy里面的操作, 只支持val变量
val str: String by lazy { "666" }
println(str) // 打印: 666
}
3.3 by Delegates.observable
fun main() {
var str: String by Delegates.observable("666") { prop, old, new ->
println("prop=$prop, old=$old, new=$new")
}
println(str) // 666
// prop=property str (Kotlin reflection is not available), old=666, new=888
str = "888"
}
3.4 by ::T
fun main() {
var example = Example("ABC")
example.str2 = "DEF"
// str1=DEF, str2=DEF
println("str1=${example.str1}, str2=${example.str2}")
}
class Example(var str1: String) {
var str2: String by ::str1
}
说明:属性被委托后,str1 和 str2 同时修改。
3.5 by map
fun main() {
var map: MutableMap<String, Any> = mutableMapOf(
"name" to "Tom",
"age" to 23,
"id" to 1001
)
var user = User(map)
println(user) // (Tom, 23, 1001)
}
class User(map: MutableMap<String, Any>) {
var name: String by map
var age: Int by map
var id: Int by map
override fun toString(): String = "($name, $age, $id)"
}
声明:本文转自【Kotlin】委托模式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)