码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-06-14 12:59:57      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:gate   一个   pre   通过   示例   ado   common   dwr   read   

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

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

标签:gate   一个   pre   通过   示例   ado   common   dwr   read   

原文地址:https://www.cnblogs.com/nicolas2019/p/11022623.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!