Ваш код никогда не будет бесконечной рекурсией, потому что он не будет компилироваться. Из-за неявного создания 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)