由可变映射烘焙的财产代表团

我有一个下面的代码:

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") } } }