当前位置:嗨网首页>书籍在线阅读

11-Map委托

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

9.3.3 Map委托

Map委托常常用来将Map中的key-value映射到对象的属性中,这经常出现在解析JSON或者其他“动态”事情的应用中。在这种情况下,可以使用映射实例自身作为委托来实现委托属性。

fun main(args: Array<String>) {
    //构造函数接收一个映射参数
    val user = User(mapOf(
            "name" to "jack",
            "age"  to 30
    ))
    println(user.name)
    println(user.age)
}
class User(var map: Map<String, Any>) {
    val name: String by map
    val age: Int  by map
}

执行上面的代码,输出结果如下。

jack
30

可以看到,User类中使用val声明了name和age属性,这就意味着这两个属性值是不可以被修改的。当然,Map委托也是支持使用var属性的,只不过需要把Map换成MutableMap。

fun main(args: Array<String>) {
    var map: MutableMap<String, Any?> = mutableMapOf(
            "name" to "Kotlin",
            "age" to 30
    )
    val user = User(map)
    println(user.name)
    println(user.age)
    println("--------------")
    map.put("name", "Google")
    map.put("age", 20)
    println(user.name)
    println(user.age)
}
class User(var map: MutableMap<String, Any?>) {
    val name: String by map
    val age: Int  by map
}

运行上面的代码,输出结果如下。

Kotlin
30
--------------
Google
20

可以看到,如果将属性委托给MutableMap,那么无论是修改MutableMap中的值,还是修改User类的属性值,变化都是同步的。