Kotlin最简单的入门教程——委托
来源:互联网 发布:c语言输出buffer内容 编辑:程序博客网 时间:2024/05/22 06:36
我感觉委托还是比较重要的,所以还是要看一下,不然后面用到都不知道是什么
1 类委托
委托模式已经证明是实现继承的一个很好的替代方式, 而 Kotlin 可以零样板代码地原生支持它。 类 Derived 可以继承一个接口 Base,并将其所有共有的方法委托给一个指定的对象:
interface Base { fun print()}class BaseImpl(val x: Int) : Base { override fun print() { print(x) }}class Derived(b: Base) : Base by bfun main(args: Array<String>) { val b = BaseImpl(10) Derived(b).print() // 输出 10}Derived 的超类型列表中的 by-子句表示 b 将会在 Derived 中内部存储。 并且编译器将生成转发给 b 的所有 Base 的方法。
2 委托属性
例如包括
延迟属性(lazy properties): 其值只在首次访问时计算,
可观察属性(observable properties): 监听器会收到有关此属性变更的通知,
把多个属性储存在一个映射(map)中,而不是每个存在单独的字段中。
延迟属性 Lazy
lazy() 是接受一个 lambda 并返回一个 Lazy 实例的函数,返回的实例可以作为实现延迟属性的委托: 第一次调用 get() 会执行已传递给 lazy() 的 lamda 表达式并记录结果, 后续调用 get() 只是返回记录的结果。
val lazyValue: String by lazy { println("computed!") "Hello"}fun main(args: Array<String>) { println(lazyValue) println(lazyValue)}
这个例子输出:
computed!
Hello
Hello
可观察属性 Observable
Delegates.observable() 接受两个参数:初始值和修改时处理程序(handler)。 每当我们给属性赋值时会调用该处理程序(在赋值后执行)。它有三个 参数:被赋值的属性、旧值和新值:
import kotlin.properties.Delegatesclass User { var name: String by Delegates.observable("<no name>") { prop, old, new -> println("$old -> $new") }}fun main(args: Array<String>) { val user = User() user.name = "first" user.name = "second"}
这个例子输出:
-> first
first -> second
如果你想能够截获一个赋值并“否决”它,就使用 vetoable() 取代 observable()。 在属性被赋新值生效之前会调用传递给 vetoable 的处理程序。
把属性储存在映射中
一个常见的用例是在一个映射(map)里存储属性的值。 这经常出现在像解析 JSON 或者做其他“动态”事情的应用中。 在这种情况下,你可以使用映射实例自身作为委托来实现委托属性。
class User(val map: Map<String, Any?>) { val name: String by map val age: Int by map}
在这个例子中,构造函数接受一个映射参数:
val user = User(mapOf( "name" to "John Doe", "age" to 25))
委托属性会从这个映射中取值(通过字符串键——属性的名称):
println(user.name) // Prints "John Doe"println(user.age) // Prints 25
这也适用于 var 属性,如果把只读的 Map 换成 MutableMap 的话:
class MutableUser(val map: MutableMap<String, Any?>) { var name: String by map var age: Int by map}
属性委托要求
对于一个只读属性(即 val 声明的),委托必须提供一个名为 getValue 的函数,该函数接受以下参数:
thisRef —— 必须与 属性所有者 类型(对于扩展属性——指被扩展的类型)相同或者是它的超类型,
property —— 必须是类型 KProperty<*> 或其超类型,
这个函数必须返回与属性相同的类型(或其子类型)。
对于一个可变属性(即 var 声明的),委托必须额外提供一个名为 setValue 的函数,该函数接受以下参数:
thisRef —— 同 getValue(),
property —— 同 getValue(),
new value —— 必须和属性同类型或者是它的超类型。
getValue() 或/和 setValue() 函数可以通过委托类的成员函数提供或者由扩展函数提供。 当你需要委托属性到原本未提供的这些函数的对象时后者会更便利。 两函数都需要用 operator 关键字来进行标记。
最后欢迎加入Kotlin QQ群,一起讨论学习:
欢迎关注 微信公号
- Kotlin最简单的入门教程——委托
- Kotlin最简单的入门教程——神秘的Lambda
- Kotlin最简单的入门教程——环境
- Kotlin最简单的入门教程——类和继承
- Kotlin最简单的入门教程——集合
- Kotlin最简单的入门教程——基础类型(一)
- Kotlin最简单的入门教程——基础类型(二)
- Kotlin最简单的入门教程——可见性修饰符,扩展,数据类,密封类
- Kotlin最简单的入门教程——关键字,操作符,异常,空指针
- Kotlin最简单的入门教程——与Java互相调用
- Kotlin入门教程——目录索引
- 委托学习笔记:最简单的委托
- c# 最简单的委托
- 最简单的 Git 入门教程
- 最简单的Lambda入门教程
- 最简单的Dagger2入门教程
- 最简单的Dagger2入门教程
- 最简单的Dagger2入门教程
- Java 多线程之CyclicBarrier
- Activity小总结
- Turnserver服务器搭建
- RSA加密算法遇到长中文字符串分解的问题
- 关于虚拟路径和绝对路径(Tomcat)
- Kotlin最简单的入门教程——委托
- 根据分钟数换算成天/小时/分钟
- 微信小程序开发不能直接操作 Page.data
- Android webview 加载不出视频
- 阿里云ECSZookeeper安装
- 发送邮箱验证码(带html格式)
- 常用排序算法-简单选择排序
- MySQL 对于千万级的大表要怎么优化?
- Android简单选择框