Belirli değerlerin Gözlemlenebilir olduğu ancak aynı zamanda Seri Hale Getirilebileceği bir sınıf oluşturmaya çalışıyorum.
Bu açıkça işe yarıyor ve serileştirme işe yarıyor, ancak her bir alan için bir ayarlayıcı eklemek ve manuel olarak aramak zorunda kalmak çok zor change(...)
her ayarlayıcı içinde:
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" })
doğru çıkışlar
changing value2
{"value2":"test2"}
Delegeleri tanıtmayı denedim.:
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" })
değişiklik algılamayı doğru şekilde tetikler, ancak seri hale getirmez:
changing value1
{}
Gözlemlenebilir'den readwriteproperty'ye gidersem,
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)
}
}
sonuç aynı:
changing blah!
{}
Delegeler için de aynı şekilde.veto edilebilir
var value4: String by Delegates.vetoable("value4", {
property: KProperty<*>, oldstring: String, newString: String ->
this.change(property.name)
true
})
çıktılar:
changing value4
{}
Delegeler sadece Kotlin Serileştirme ile çalışmıyor gibi görünüyor
Diğer platformlarda da çalışacak olan serileştirmesini bozmadan bir mülkün değişikliklerini gözlemlemek için başka hangi seçenekler vardır (KotlinJS, KotlinJVM, Android,...)?