Зритель звонков

Я использую realm как базу данных и kotlin как язык.
Я применил свой собственный метод настройки для свойства.

Позволяет ли Realm назвать этого сеттера каким-то образом?

Например:

open class Human(): RealmObject() { open var Name: String = "" set(value) { setName(value) } } 

Теперь у меня также есть свойство changeDate и было бы неплохо, если бы я мог автоматически установить changeDate в setName на новый фактический день.

Но я не могу этого сделать, если Realm также называет этот метод.

благодаря

Я пробовал это с Kotlin 1.1.1 и Realm 3.0.0, и он не вызывает пользовательский сеттер, он присваивает значение каким-либо другим способом (что означает, что он даже работает, если ваш пользовательский сеттер пуст, что немного неожиданно).

Изменить: просмотрел сгенерированный код и отладчик.

Когда вы используете объект, подключенный к Realm, это экземпляр класса прокси, который является подклассом класса, который вы используете в своем коде. Когда вы читаете свойства этого экземпляра, вызов получателя переходит к естественным вызовам для доступа к сохраненному значению, которое находится на диске, внутри Realm.

Точно так же вызов setter в конечном итоге переходит к нативным вызовам, чтобы установить соответствующие значения. Это объясняет, почему сеттер не вызван: Realm не требует вызова setter, потому что он не загружает значения в память с нетерпением, прокси просто указывает на реальные данные в Realm и всякий раз, когда вы читаете это значение, он будет читать его оттуда.

Что касается того, как это относится к котлинскому коду, вызовы сеттера и получателя прокси, которые обращаются к данным внутри Realm, происходят всякий раз, когда вы используете ключевое слово field (по большей части).

 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 }