kotlin-代理属性(by)

本文介绍Kotlin中的代理模式,通过代理对象实现对真实对象的访问,重点讲解属性委托的实现方式,包括by关键字的使用,以及lazy、observable等不同类型的属性委托。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

归纳自:https://blog.youkuaiyun.com/IO_Field/article/details/53374809

代理模式
客户端使用一个代理对象实现对真实对象的访问,代理对象和真实对象实现相同的接口,代理对象持有真实对象

Kotlin-代理属性(by)
Kotlin中,委托的实现依靠于关键字 by ,by表示将实现接口的真实对象(by后边的实例)保存在代理对象的内部,比如SportsManager类继承于ISports接口,并可以ISports接口的所有的 public 方法委托给一个指定的对象。
interface ISports {
  fun doSports()
}

class SwimForSports: ISports{
override fun doSports() {
  println("do swim")
}
}

class SportsManager(sport: ISports): ISports by sport

fun main(args: Array<String>) {
  val swimSports: SwimForSports = SwimForSports()
  SportsManager(swimSports).doSports()// Log:do swim
}
在SportsManager声明中,by子句表示,将sport保存在SportsManager的对象实例内部,而且编译器将会生成继承自 ISports 接口的所有方法, 并将调用转发给sport

委托属性
by关键字之后的表达式就是委托,属性的get()方法(以及set() 方法)将被委托给这个对象的 getValue()和setValue()方法.属性委托不必实现任何接口, 但必须提供 getValue() 函数(对于 var属性,还需要 setValue() 函数)
by lazy :
延迟加载属性(lazy property): 属性值只在初次访问时才会计算。var类型属性不能设置为延迟加载属性,因为在lazy中并没有setValue(…)方法
val no: Int by lazy {
  200
}
by Delegates.(...)
可观察属性(observable property): 属性发生变化时, 可以向监听器发送通知
Delegates.observable
Delegates.vetoable
Delegates.notNull()
将多个属性保存在一个 map 内, 而不是保存在多个独立的域内
class User(val map: Map<String, Any?>) {
  val name: String by map
  val age: Int by map
}

转载于:https://www.cnblogs.com/taobiao/p/10026452.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值