Переопределение сеттера на VAR - PullRequest
9 голосов
/ 13 февраля 2011

крошечный вопрос с, надеюсь, крошечным ответом:

В моем классе есть var, который должен запускать какое-то обновление, когда оно установлено. Я знаю, что var неявно получает два метода: геттер и сеттер. Можно ли каким-то образом переопределить метод установки, чтобы убедиться, что обновление запущено, не становясь рекурсивным? Я имею в виду

def a_=(x: Any) = { a = x; update }

Вероятно, будет бесконечная рекурсия, верно?

var устанавливается только вне класса и только для чтения внутри класса, может быть, это поможет.

Спасибо за внимание.

1 Ответ

4 голосов
/ 14 февраля 2011

Ваш код никогда не будет бесконечной рекурсией, потому что он не будет компилироваться. Из-за неявного создания Getter и Setter компилятором вы не можете создавать такие методы дважды. Я не знаю, есть ли причина, по которой компилятор не проверяет, существует ли Getter или Setter, и только если таких методов нет, он создает их.

Вы можете избежать этой проблемы, переименовав приватную переменную:

class X(private var _i: Int) {
  def i = _i
  def i_=(i: Int) {
    println(i)
    _i = i
  }
}

Эти методы имеют ту же сигнатуру, что и методы, сгенерированные компилятором.

Если метод update вызывается только один раз, вы можете сделать это внутри объекта-компаньона:

object X {
  def apply(i: Int) = {
    update
    new X(i)
  }
}
class X(i: Int)

Есть ли причина, по которой вы не предпочитаете неизменный объект? Если нет, вы можете скопировать старое и одновременно установить новое значение:

case class X(i: Int, j: Int)
val x1 = X(3, 6)
val x2 = x1.copy(i = 1) // x2 = X(1,6)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...