Je suis en train de construire une classe où certaines valeurs sont Observables, mais aussi Serializable.
De toute évidence, cela fonctionne et la sérialisation fonctionne, mais c'est très passe-partout-lourd d'avoir à ajouter une définition pour chaque champ et manuellement à l'appel change(...)
à l'intérieur de chaque setter:
interface Observable {
fun change(message: String) {
println("changing $message")
}
}
@Serializable
class BlahVO : Observable {
var value2: String = ""
set(value) {
field = value
change("value2")
}
fun toJson(): String {
return Json.encodeToString(serializer(), this)
}
}
println(BlahVO().apply { value2 = "test2" })
correctement les résultats
changing value2
{"value2":"test2"}
J'ai essayé d'introduire des Délégués:
interface Observable {
fun change(message: String) {
println("changing $message")
}
@Suppress("ClassName")
class default<T>(defaultValue: T) {
private var value: T = defaultValue
operator fun getValue(observable: Observable, property: KProperty<*>): T {
return value
}
operator fun setValue(observable: Observable, property: KProperty<*>, value: T) {
this.value = value
observable.change(property.name)
}
}
}
@Serializable
class BlahVO : Observable {
var value1: String by Observable.default("value1")
fun toJson(): String {
return Json.encodeToString(serializer(), this)
}
}
println(BlahVO().apply { value1 = "test1" })
correctement déclenche la détection du changement, mais il n'a pas sérialiser:
changing value1
{}
Si je vais à partir d'Observables à ReadWriteProperty,
interface Observable {
fun change(message: String) {
println("changing $message")
}
fun <T> look(defaultValue: T): ReadWriteProperty<Observable, T> {
return OP(defaultValue, this)
}
class OP<T>(defaultValue: T, val observable: Observable) : ObservableProperty<T>(defaultValue) {
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
super.setValue(thisRef, property, value)
observable.change("blah!")
}
}
}
@Serializable
class BlahVO : Observable {
var value3: String by this.look("value3")
fun toJson(): String {
return Json.encodeToString(serializer(), this)
}
}
le résultat est le même:
changing blah!
{}
De même pour les Délégués.vetoable
var value4: String by Delegates.vetoable("value4", {
property: KProperty<*>, oldstring: String, newString: String ->
this.change(property.name)
true
})
sorties:
changing value4
{}
Les délégués ne semble tout simplement pas travailler avec Kotlin la Sérialisation
Quelles sont les autres options sont là pour observer une propriété de modifications sans casser sa sérialisation qui fonctionne également sur d'autres plates-formes (KotlinJS, KotlinJVM, Android, ...)?