由可变映射烘焙的财产代表团
我有一个下面的代码:
class Mapped(var data:Map<String,String>){ val firstName:String by data }
这适用于使用Mapped
情况,如下所示:
val mapped = Mapped(mapOf("firstName" to "initialFirstName")) println(mapped.firstName); // prints "initialFirstName"
但是由于data
属性是可变的,我们可以改变它的值,即:
mapped.data = mapOf("firstName" to "updated");
但是, firstName
属性仍然包含"initialFirstName"
。
有没有解决这个问题的方法 ,虽然对我来说是已知的/有记录的,但是还是有意想不到的?
在问题KT-5870 , KT-9772解决之前,您可以执行以下操作:
operator fun <V, V1 : V> (() -> Map<in String, V>).getValue(thisRef: Any?, property: KProperty<*>): V1 { val map = this() return map[property.name] as V1 }
然后可以如下使用:
class Mapped(var data:Map<String,String>){ val firstName:String by { data } }
以上不能很好地处理可空性。 这是一个改进的版本:
operator fun <V, V1 : V> (() -> Map<in String, V>).getValue(thisRef: Any?, property: KProperty<*>): V1 { val map = this() val key = property.name @Suppress("UNCHECKED_CAST") val value = map[key] as V1 if (property.returnType.isMarkedNullable) { return value } else { if(value != null){ return value } if(map.containsKey(key)){ throw KotlinNullPointerException("Property baking map returned null value for key '$key' for non nullable property: $property") } else { throw KotlinNullPointerException("Property baking map has no key '$key' for non nullable property $property") } } }