О вопросе 1: Полагаю, вы хотите отследить, был ли объект изменен с момента последнего копирования на сервер, не так ли? Это разумно, поскольку копия на сервере не может быть изменена: в противном случае обеспечение согласованности реплики является более сложным (согласованность реплики является ключевым словом для поиска в Google, но я бы не рекомендовал его).
Для ясности я бы говорил о том, чтобы быть чистым или грязным - синхронизация слишком напоминает мне оператор synchronized
Java.
Что касается вопроса 2, вам не нужно указывать __isSync
a private val
(который будет храниться в классе), вы можете оставить его в качестве параметра конструктора. Пока он не используется (кроме вызова конструктора A), __isSync
не должен занимать дополнительное место в экземплярах B. Я удалил там аннотацию private val
, получив этот код, который правильно компилируется, как и ожидалось.
class A(protected var isSync: Boolean) {
}
class B(private var __value: String, __isSync: Boolean)
extends A(__isSync) {
def value = __value
def value_=(value: String) = {
this.isSync = false
this.__value = value
}
}
Об эстетике и вопросе 3: я бы просто избежал двойного подчеркивания. Подобные примеры из программирования в Scala (раздел 18.2) просто используют более короткие имена. Они также используют private[this]
для предотвращения доступа к члену из других экземпляров того же класса. Наконец, вы можете удалить {}
после класса decl. в этом примере (даже если возможно не в вашем коде).
Таким образом, мы получили бы код, подобный этому, что близко к примерам, которые я уже упоминал:
class A(protected var isSync: Boolean)
class B(private[this] var v: String, sync: Boolean)
extends A(sync) {
def value = v
def value_=(value: String) = {
isSync = false
v = value
}
}