覆盖var的setter

时间:2011-02-13 19:31:01

标签: scala

一个小问题,希望答案很小:

我的班级中有一个var,无论何时设置都需要触发某种更新。我知道var隐式获取两个方法,一个getter和一个setter。是否有可能以某种方式覆盖setter方法以确保更新被触发,而不会递归?我的意思是

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

可能是无限递归,对吧?

var只在课堂外设置,只在课堂内阅读,也许有帮助。

感谢收听。

1 个答案:

答案 0 :(得分:4)

您的代码永远不会是无限递归,因为它无法编译。由于编译器隐式创建了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)