Kotlin支持扩展方法,扩展方法是个颇有意思的东西bash
仍是举个栗子比较直观app
好比咱们想打印10次“abc”的字符串,最容想到的是使用循环。那么单独抽出来成方法,就是这样ui
fun String.copyContent(times: Int): String{
var string = StringBuilder()
for (i in 0 until times){
string.append(this)
}
return string.toString()
}
复制代码
你仔细看看这个方法,它和普通方法有一点不太同样,那就是它的方法名前有一个 String.this
这么写有什么好处呢?看下面的调用操做你就明白了spa
println( "abc".copyContent(10))
复制代码
上面的结果就是输出10次abc的字符串代理
有没有发现很简洁,直接字符串点方法就ok了code
经过上面方式定义的方法就是扩展方法,注意扩展方法的this代替的就是调用者“abc”字符串
其实上面的栗子还能够写的更骚get
怎么个骚操做呢,那就是使用运算符string
operator fun String.times(times: Int): String{
var string = StringBuilder()
for (i in 0 until times){
string.append(this)
}
return string.toString()
}
复制代码
下面就是见证奇迹的时候了
println("abc"*10)
复制代码
不知道的一看会觉得String类有这么一种运算呢,啊哈哈,能够说这波操做很骚了
属性代理是什么,代理模式?
咱们先看一个栗子:
Kotlin对常量进行延迟加载对时候就用到了属性代理,它是这样的:
val lazyValue: String by lazy {
println("computed!")
"Hello"
}
fun main() {
println(lazyValue)
println(lazyValue)
}
复制代码
输出结果
computed!
Hello
Hello
能够看到computed!只输出了一次,这代表它的确是在用到这个常量的时候才去赋值。
该说回属性代理了,其实它的内部就是经过lazy这个属性代理实现的
可是它怎么经过属性代理实现延迟加载的呢?这里不说,由于不是重点,也不是我举这个栗子的目的,笔者是想让大家感觉到属性代理的强大之处,它把全部的具体实现都交给了某个属性来作,对外部来讲是透明的,这就很是舒服了。
下面说说咱们怎么去实现属性代理?
仍是举个栗子:
实现经过属性代理的方式对变量进行赋值和取值的操做(栗子很简单,关键看实现)
属性代理类Delegate
class Delegate{
private var value: String ?= null
operator fun getValue(thisRef: Any?, property: KProperty<*>): String{
println("$thisRef, thank you for delegating '${property.name}' to me!")
return value?: ""
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
this.value = value
println("$value has been assigned to '${property.name}' in $thisRef.")
}
}
复制代码
能够看到代理类有两个方法,setValue()和getValue()
注意:若是是常量val的话,只须要实现getValue就能够;若是是变量var,那就须要实现setValue()和getValue()两个方法
经过属性代理实现功能
var de = Delegate()
var b: String by de
b = "10"
println(b)
复制代码
输出结果
10 has been assigned to 'b' in null.
null, thank you for delegating 'b' to me!
10
根据输出结果能够看到整个过程是经过属性代理类Delegate实现的
这个栗子虽然简单,但透过表面看本质,咱们只须要经过一个属性就能够实现功能,至于怎么实现的对咱们来讲是透明的。