kotlin委托工厂map存储属性值

Posted nicolas2019

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于kotlin委托工厂map存储属性值的主要内容,如果未能解决你的问题,请参考以下文章

如何为 kotlin 委托属性使用不同的类型

委托-kotlin

Kotlin 对象枚举委托

Kotlin 委托的本质以及 MMKV 的应用

Kotlin 委托的本质以及 MMKV 的应用

Kotlin小知识之泛型和委托