मैं कोशिश कर रहा हूँ का निर्माण करने के लिए एक वर्ग जहां कुछ मूल्यों नमूदार हैं, लेकिन यह भी Serializable.
जाहिर है, यह काम करता है और क्रमबद्धता काम करता है, लेकिन यह बहुत बॉयलरप्लेट-भारी होने के जोड़ने के लिए एक सेटर के लिए हर एक क्षेत्र और मैन्युअल रूप से कॉल करने के लिए होने change(...)
हर सेटर:
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" })
सही ढंग से outputs
changing value2
{"value2":"test2"}
मैंने कोशिश की है परिचय के प्रतिनिधियों:
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" })
सही ढंग से चलाता परिवर्तन का पता लगाने, लेकिन यह नहीं serialize:
changing value1
{}
अगर मैं जाने से नमूदार करने के लिए 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)
}
}
परिणाम एक ही है:
changing blah!
{}
इसी प्रकार के प्रतिनिधियों के लिए.vetoable
var value4: String by Delegates.vetoable("value4", {
property: KProperty<*>, oldstring: String, newString: String ->
this.change(property.name)
true
})
outputs:
changing value4
{}
प्रतिनिधियों बस नहीं लगता है के साथ काम Kotlin क्रमबद्धता
क्या अन्य विकल्प वहाँ रहे हैं निरीक्षण करने के लिए एक संपत्ति के परिवर्तन को तोड़ने के बिना अपने क्रमबद्धता होगा कि यह भी काम पर अन्य प्लेटफार्मों (KotlinJS, KotlinJVM, एंड्रॉयड, ...)?