跳转到内容

Scala/访问修饰符

来自维基教科书,开放世界中的开放书籍

Scala 提供了多个访问修饰符。访问修饰符可用于更改类、对象、特质和包的成员在哪些上下文中可访问。限制对成员的访问有助于将接口与实现分离,确保和验证不变式并维护成员的完整性。

访问修饰符

[编辑 | 编辑源代码]

访问修饰符更改了成员可以被引用的时间。尝试引用不可访问的成员会导致编译时错误。

成员的默认访问修饰符是“公共”访问修饰符。具有“公共”访问权限的成员可以在任何地方访问。没有“公共”访问权限的关键字。

“私有”访问修饰符禁止在成员定义范围之外的任何地方访问。

class StopWatch {
  //INVARIANT: "seconds" is 0 or positive (assuming no overflows).
  private var seconds = 0
  def addSeconds(secondsAmount:Int) {
    if (secondsAmount > 0) {
      seconds += secondsAmount
    }
  }
  def currentSeconds = seconds
}
val stopWatch = new StopWatch
stopWatch.addSeconds(-10)
println("Seconds: " + stopWatch.currentSeconds) //Prints "Seconds: 0".
stopWatch.addSeconds(5)
println("Seconds: " + stopWatch.currentSeconds) //Prints "Seconds: 5".
//ERROR: Does not compile!
//stopWatch.seconds = -10

名为“StopWatch”的类在第一部分定义。类的第一个成员定义是“private var seconds = 0”。关键字“private”用于“var”声明之前,表示以下变量,此处为“seconds”,具有私有访问权限。这意味着它只能在包含类“StopWatch”的范围内访问。“addSeconds”和“currentSeconds”分别修改和检索“seconds”。请注意,“addSeconds”阻止将负值添加到“seconds”。类定义之后的行实例化类“StopWatch”的实例,并调用不同的方法。无法使用“addSeconds”方法从“seconds”中减去,并且尝试通过在“StopWatch”之外直接引用“seconds”来操作它会在编译时失败。因此,始终遵守要求“seconds”为 0 或正数的不变式,假设没有溢出。

访问修饰符的作用域

[编辑 | 编辑源代码]

伴生对象

[编辑 | 编辑源代码]
华夏公益教科书