Kotlin委托

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

委托
委托 == 代理
方法内的成员永远拿不到thisRef:官方委托和自定义委托-》方法里面没办法使用反射
委托只能类委托和属性委托

Kotlin委托

本文链接:https://blog.youkuaiyun.com/feather_wch/article/details/132095759

类委托

1、类委托

  1. 委托的是接口的方法
// 只能用于接口
interface DB{
   
   
    fun save()
}
// 类CreateDBAction实现了接口DB,参数db是DB类型,类的实现委托给参数db。
// 目的:啥也不想干
class CreateDBAction(db: DB):DB by db

2、类委托的原理是什么?生成了什么代码?

  1. 成员变量:$$delegate_0 = 参数db
  2. 实现方法:委托给$$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、类委托有什么用?

  1. 减少委托的代码
  2. 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、委托属性有什么用?

  1. 字段升级,老字段适配老用户,新字段用于新用户。共用一个get、set
class Database{
   
   
    var data = 941226 // 1.0
    var newData by ::data // 2.0
}

3、懒加载委托也就是属性委托

  1. 第一次获取时,才会获取,下面例子第一次获取耗时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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猎羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值