美文网首页Android开发经验谈Kotlin艺术探索Kotlin编程
Kotlin艺术探索之扩展方法和属性代理

Kotlin艺术探索之扩展方法和属性代理

作者: 树獭非懒 | 来源:发表于2019-06-06 18:56 被阅读2次

扩展方法

Kotlin支持扩展方法,扩展方法是个很有意思的东西

还是举个栗子比较直观

比如我们想打印10次“abc”的字符串,最容想到的是使用循环。那么单独抽出来成方法,就是这样

fun String.copyContent(times: Int): String{

    var string = StringBuilder()
    for (i in 0 until times){
        string.append(this)
    }
    return string.toString()
}

你仔细看看这个方法,它和普通方法有一点不太一样,那就是它的方法名前有一个 String.

这么写有什么好处呢?看下面的调用操作你就明白了

println( "abc".copyContent(10))

上面的结果就是输出10次abc的字符串

有没有发现很简洁,直接字符串点方法就ok了

通过上面方式定义的方法就是扩展方法,注意扩展方法的this代替的就是调用者“abc”

其实上面的栗子还可以写的更骚

怎么个骚操作呢,那就是使用运算符

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实现的

这个栗子虽然简单,但透过表面看本质,我们只需要通过一个属性就可以实现功能,至于怎么实现的对我们来说是透明的。

相关文章

  • Kotlin艺术探索之扩展方法和属性代理

    扩展方法 Kotlin支持扩展方法,扩展方法是个很有意思的东西 还是举个栗子比较直观 比如我们想打印10次“abc...

  • Kotlin-面向对象-进阶

    扩展 扩展方法 Kotlin支持扩展方法和扩展属性。语法:被扩展的类/接口名.方法名() 父类不能使用子类的扩展方...

  • Kotlin 扩展

    Kotlin 扩展Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorator 模式。扩...

  • kotlin语言学习10 ——kotlin 可见性与扩展

    本节主要介绍kotlin的可见性与kotlin中的扩展功能的使用,包括:扩展类、扩展方法、扩展伴生对象、扩展属性等...

  • Kotlin 扩展

    原本地址:Kotlin 扩展 Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorato...

  • Kotlin的扩展属性和扩展方法

    扩展方法的原理 Kotlin 中类的扩展方法并不是在原类的内部进行拓展,通过反编译为Java代码,可以发现,其原理...

  • 三,Kotlin扩展方法和扩展属性

    扩展方法 Kotlin 能够扩展一个类的新功能而无需继承该类或者使用像装饰者这样的设计模式。 这通过叫做 扩展 的...

  • kotlin基础(三)

    kotlin扩展函数 Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 装饰者模式。定义形式:f...

  • Kotlin基础(5)-扩展属性和扩展函数

    前言 本文介绍Kotlin扩展函数与扩展属性的相关方法 扩展属性 首先看如下的一段代码: 测试结果 形式: XXX...

  • kotlin 扩展属性

    与扩展方法类似,扩展属性当然也不是真正添加进了原类。 扒开糖衣看看kotlin扩展属性实现原理。 给Date类添加...

网友评论

    本文标题:Kotlin艺术探索之扩展方法和属性代理

    本文链接:https://www.haomeiwen.com/subject/rlauxctx.html