委托
委托 == 代理
方法内的成员永远拿不到thisRef:官方委托和自定义委托-》方法里面没办法使用反射
委托只能类委托和属性委托
Kotlin委托
本文链接:https://blog.youkuaiyun.com/feather_wch/article/details/132095759
类委托
1、类委托
- 委托的是接口的方法
// 只能用于接口
interface DB{
fun save()
}
// 类CreateDBAction实现了接口DB,参数db是DB类型,类的实现委托给参数db。
// 目的:啥也不想干
class CreateDBAction(db: DB):DB by db
2、类委托的原理是什么?生成了什么代码?
- 成员变量:$$delegate_0 = 参数db
- 实现方法:委托给$$delegate_0调用save()
public final class CreateDBAction implements DB {
// $FF: synthetic field
private final DB $$delegate_0;
public CreateDBAction(@NotNull DB db) {
Intrinsics.checkNotNullParameter(db, "db");
super();
this.$$delegate_0 = db;
}
public void save() {
this.$$delegate_0.save();
}
}
3、类委托有什么用?
- 减少委托的代码
- Compose是重委托
CreateDBAction(SqlDB()).save()
CreateDBAction(OracleDB()).save()
属性委托
1、属性委托,委托的是 属性的 set和get
class MyKt{
var value = 1314
var number by ::value // 两个属性公用get和set
}
// number -> getNumber() -> getValue()
// number = 10 -> setNumber(10) -> setValue(10)
2、委托属性有什么用?
- 字段升级,老字段适配老用户,新字段用于新用户。共用一个get、set
class Database{
var data = 941226 // 1.0
var newData by ::data // 2.0
}
3、懒加载委托也就是属性委托
- 第一次获取时,才会获取,下面例子第一次获取耗时2秒,其他都立马获得
fun requestDownload(): String{
Thread.sleep(2000L)
return "sucess"
}
// 懒加载,
// 属性委托,委托给
val responseData : String by lazy {
requestDownload()
}
// val responseData : String = SynchronizedLazyImpl(requestDownload())
// 借助了SynchronizedLazyImpl的get方法
fun main(){
println("startloading...")
println(responseData)
println(responseData)
println(responseData)

本文详细介绍了Kotlin中的类委托和属性委托,包括原理、用途、示例以及实战场景。还探讨了如何使用委托实现ViewModel的自动构造和双向数据绑定,以及如何手动实现String的代理。
最低0.47元/天 解锁文章
2849

被折叠的 条评论
为什么被折叠?



