kotlin-代理属性(by)

归纳自:https://blog.csdn.net/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

根据提供的引用内容,出现了两个关于Kotlin的错误信息。第一个引用中显示了一个无法解析依赖的错误,指出无法下载kotlin-reflect.jar文件。第二个引用中显示了一个关于kotlin-gradle-1.8.10.jar (org.jetbrains.kotlin:kotlin-reflect)",这个错误通常是由于Gradle无法找到所需的kotlin-reflect库而引起的。解决这个问题的方法是确保你的项目的Gradle配置正确,并且指定了正确的Kotlin版本。 你可以尝试以下几个步骤来解决这个问题: 1. 确保你的项目的build.gradle文件中包含了正确的Kotlin版本和kotlin-gradle-plugin版本。你可以在build.gradle文件中找到类似于以下代码的部分: ```groovy ext { kotlin_version = '1.8.10' } dependencies { // ... implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" // ... } buildscript { // ... dependencies { // ... classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // ... } } ``` 请确保kotlin_version变量的值与你想要使用的Kotlin版本一致,并且在dependencies和buildscript的classpath中正确引用了kotlin-gradle-plugin。 2. 如果你已经确认了build.gradle文件中的配置正确无误,那么可能是因为Gradle无法从远程仓库下载kotlin-reflect.jar文件。你可以尝试清除Gradle的缓存并重新构建项目。在命令行中执行以下命令: ```shell ./gradlew clean ``` 然后重新构建项目: ```shell ./gradlew build ``` 这将清除Gradle的缓存并重新下载所需的依赖。 3. 如果上述步骤***切换到其他网络环境来解决这个问题。 希望以上步骤能够帮助你解决问题。如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值