一个小问题,希望答案很小:
我的班级中有一个var
,无论何时设置都需要触发某种更新。我知道var
隐式获取两个方法,一个getter和一个setter。是否有可能以某种方式覆盖setter方法以确保更新被触发,而不会递归?我的意思是
def a_=(x: Any) = { a = x; update }
可能是无限递归,对吧?
var
只在课堂外设置,只在课堂内阅读,也许有帮助。
感谢收听。
答案 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)