kotlin委托工厂、map存储属性值

1.委托工厂

(1)概念

​ 委托工厂顾名思义:生产委托对象的工厂类。

(2)定义

​ 该类实现了operator修饰的provideDelegate方法,返回ReadWriteProperty/ReadOnlyProperty,该类就可提供对应类型的委托对象。

/**
 * 委托工厂类(生产委托对象)
 */
class ProvideDelegate {
    /**
     * 定义该方法该类就是委托工厂类
     * 返回值:ReadWriteProperty<CommonClass,String>或者ReadOnlyProperty<CommonClass,String>都可以,一个是返回读写属性的委托类,一个是返回只读属性的委托类
     */
    operator fun provideDelegate(thisRef: Any?, property: KProperty<*>) : ReadWriteProperty<CommonClass,String> {
        println("provideDelegate")
        return MyDelegateClass()
    }
}

/**
 * 定义一个委托类,实现了ReadWriteProperty(读写属性委托类)接口,只读属性委托类实现ReadOnlyProperty接口即可
 */
class MyDelegateClass : ReadWriteProperty<CommonClass,String>{
    var _property : String = "委托类属性初始值"
    override fun getValue(thisRef: CommonClass, property: KProperty<*>): String {
        println("getValue")
        return _property
    }

    override fun setValue(thisRef: CommonClass, property: KProperty<*>, value: String) {
        println("setValue")
        _property = value
    }

}

/**
 * 定义一个普通类
 */
class CommonClass {
    /**
     * 属性委托于委托工厂
     */
    var property : String by ProvideDelegate()
}

fun main(args: Array<String>) {
    val commonClass = CommonClass()
    println(commonClass.property)
    commonClass.property = "修改值"
    println(commonClass.property)
}

运行结果:

provideDelegate
getValue
委托类属性初始值
setValue
getValue
修改值

2.委托属性应用-使用Map存储属性值

(1)原理

  • Map实现了符合属性委托规则的getValue方法,因此只读属性可委托于map对象。
  • MutableMap实现了符合属性委托规则的setValue和getValue方法,因此读写属性可委托于mutableMap对象。
这么做的好处是对象本身不负责存储属性值,交给Map对象管理,程序也不需要将对象直接暴露出来,只需要通过map管理对象属性即可。

(2)示例

只读属性示例:

/**
 * 定义一个类,构造器传入map对象
 */
class MapDelegateClass(map: Map<String, String>) {
    val property1 : String by map//只读属性委托于map对象
    val property2 : String by map//只读属性委托于map对象
}

fun main(args: Array<String>) {
    val map = mapOf(
            "property1" to "p1",
            "property2" to "p2"
    )
    val mapDelegateClass = MapDelegateClass(map)
    println(mapDelegateClass.property1)//①
    println(mapDelegateClass.property2)//②
    println(map["property1"])//通过map索引属性值名来获取属性,等同于①
    println(map["property2"])//通过map索引属性值名来获取属性,等同于②
}

运行结果:

p1
p2
p1
p2

读写属性示例:

/**
 * 定义一个类,构造器传入MutableMap对象
 */
class MutableMapDelegate(mutableMap: MutableMap<String, String>) {
    var property1: String by mutableMap//属性1委托于mutableMap对象
    var property2: String by mutableMap//属性2委托于mutableMap对象
}

fun main(args: Array<String>) {
    val mutableMap = mutableMapOf<String, String>()
    mutableMap["property1"] = "p1"//①
    mutableMap["property2"] = "p2"//②
    val mutableMapDelegate = MutableMapDelegate(mutableMap)
    println(mutableMapDelegate.property1)
    println(mutableMapDelegate.property2)
    mutableMapDelegate.property1 = "p1change"//等同于①
    mutableMapDelegate.property2 = "p2change"//等同于②
    println(mutableMapDelegate.property1)
    println(mutableMapDelegate.property2)
}

运行结果:

p1
p2
p1change
p2change
posted @ 2019-06-14 12:01  谢光伟  阅读(713)  评论(0编辑  收藏  举报