我使用realm作为数据库,使用kotlin作为语言 我为属性实现了自定义setter方法。
Realm是否以某种方式调用此setter?
例如:
open class Human(): RealmObject()
{
open var Name: String = ""
set(value)
{
setName(value)
}
}
现在我还有一个属性changeDate
,如果我可以在changeDate
中自动将setName
设置为新的实际日期,那就太好了。
但是,如果Realm也调用了这个方法,我就无法做到这一点。
由于
答案 0 :(得分:1)
我用Kotlin 1.1.1和Realm 3.0.0尝试了这个,它没有调用自定义setter,它以其他方式分配值(这意味着它甚至可以在你的自定义setter为空时工作,这有点出乎意料)。
编辑:查看生成的代码和调试程序。
当您使用连接到Realm的对象时,它是代理类的实例,它是您在代码中使用的类的子类。当您正在读取此实例的属性时,对getter的调用会转到本机调用,以访问Realm中磁盘上的存储值。
类似地,调用setter最终会获得本机调用以设置适当的值。这解释了为什么setter不被调用:Realm不需要调用setter,因为它不会急切地将值加载到内存中,代理只是指向Realm中的真实数据,并且每当你读到它时价值,它将从那里读取。
至于这与Kotlin代码的关系,只要您使用field
关键字(大部分),就会调用访问Realm内部数据的代理的setter和getter。
var Name: String = ""
get() {
return field // this calls `String realmGet$Name()` on the proxy
}
set(value) {
field = value // this calls `void realmSet$Name(String value)` on the proxy
}