一个小问题,希望是一个很小的答案:
var我的班级中有一个需要在设置时触发某种更新.我知道var隐式获取两个方法,一个getter和一个setter.是否有可能以某种方式覆盖setter方法以确保更新被触发,而不会递归?我的意思是
def a_=(x: Any) = { a = x; update }
Run Code Online (Sandbox Code Playgroud)
可能是无限递归,对吗?
该var只设置类之外,只读类里面,也许有帮助.
谢谢收听.
您的代码永远不会是无限递归,因为它无法编译。由于编译器隐式创建了 Getter 和 Setter,因此您不能两次创建此类方法。我不知道编译器是否有原因不检查 Getter 或 Setter 是否存在,只有在不存在此类方法时才会创建此类方法。
您可以通过重命名私有变量来避免此问题:
class X(private var _i: Int) {
def i = _i
def i_=(i: Int) {
println(i)
_i = i
}
}
Run Code Online (Sandbox Code Playgroud)
这些方法与编译器生成的方法具有相同的签名。
如果该update方法仅被调用一次,则可以在伴生对象中执行此操作:
object X {
def apply(i: Int) = {
update
new X(i)
}
}
class X(i: Int)
Run Code Online (Sandbox Code Playgroud)
你有什么理由不喜欢不可变的对象吗?如果不是,可以复制旧值,同时设置一个新值:
case class X(i: Int, j: Int)
val x1 = X(3, 6)
val x2 = x1.copy(i = 1) // x2 = X(1,6)
Run Code Online (Sandbox Code Playgroud)