覆盖var的setter

Lan*_*nbo 9 scala

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

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

def a_=(x: Any) = { a = x; update }
Run Code Online (Sandbox Code Playgroud)

可能是无限递归,对吗?

var只设置类之外,只读类里面,也许有帮助.

谢谢收听.

kir*_*uku 4

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

  • 不,我这里需要一个可变状态,它是 swing 组件的成员“var”。我可能会在这里使用代理方法,这是我能看到的唯一解决方案。但它是如此……不优雅。我选择 Scala 而不是 Java 是有原因的。但感谢您的意见。 (2认同)