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