data class Person private constructor(
var name: ObservableField<String> = ObservableField("Tony Starks"),
var age: ObservableField<Int> = ObservableField(40),
var gender: ObservableField<String> = ObservableField("Male"),
var test: String = "Tony Starks",
) {
operator fun set(key: String, value: String) {
// Tried this approach but it didn't work.
this[key] = value
}
}我想要实现的是这一点;
val person = Person()
person['test'] = "James Bond"我已经能够用PHP实现同样的目标
class Person {
private $name;
private $age;
private $gender;
public __get($key) {
return $this[$key];
}
public __set($key, $value) {
$this[$key] = $value;
}
}在科特林有可能做到这一点吗?
发布于 2021-05-06 14:12:14
这种行为是像Kotlin这样的强类型语言中的反模式。通常情况下,不要试图强迫强类型语言表现得像弱类型语言是明智的。在使用强类型语言时,您的整个思维和设计方式应该是不同的。
尽管如此,通过使类本身成为MutableMap和委托相关属性,可以获得类似的语法。您可以通过委托(如下面所示)或通过子类MutableMap使其成为HashMap。但是,如果使用的是属性委托,则不能将其设置为data class。
class Person: MutableMap<String, Any?> by mutableMapOf() {
var test: String by this
init {
test = "Tony Stark"
}
override fun toString() = "Person(test='$test')"
}
fun main() {
val person = Person()
println(person)
person["test"] = "Pepper Potts"
println(person)
person.test = "Happy Hogan"
println(person["test"])
}
/** Prints:
Person(test='Tony Stark')
Person(test='Pepper Potts')
Happy Hogan
*/这样做的缺点(类似于弱类型语言中的问题)是:
Kotlin之所以能够将属性委托给Map (尽管它通常是一个反模式),是因为它在处理运行时动态数据(如JSON )时使用过,您可以在类表示之间来回转换。
https://stackoverflow.com/questions/67419373
复制相似问题