Scala 访问修饰符

Scala 使用访问修饰符控制类、字段、方法和构造器的可见性。合理使用访问控制可以隐藏实现细节,减少模块之间的耦合。

默认访问级别

Scala 中没有显式修饰符时,成员默认是公共的。

class User(val name: String) {
  def greet(): String = s"Hello, $name"
}

namegreet 都可以从外部访问。

private

private 成员只能在当前类或对象内部访问。

class BankAccount(initialBalance: BigDecimal) {
  private var balance: BigDecimal = initialBalance

  def deposit(amount: BigDecimal): Unit = {
    balance += amount
  }

  def currentBalance: BigDecimal = balance
}

这里 balance 被隐藏,外部只能通过方法读取或修改。

protected

protected 成员可以在当前类和子类中访问。

class Animal {
  protected def sound: String = "unknown"
}

class Dog extends Animal {
  def bark(): String = sound
}

private[this]

private[this] 将访问范围限制到当前对象实例,比普通 private 更严格。

class Counter {
  private[this] var value = 0

  def increment(): Unit = {
    value += 1
  }
}

包级私有

Scala 支持限定访问范围,例如 private[models] 表示该成员在 models 包内可见。

package app.models

class UserRepository {
  private[models] def reloadCache(): Unit = {
    // only visible inside app.models
  }
}

这在大型项目中很有用,可以让同一模块内协作,同时避免暴露给整个应用。

私有构造器

可以把构造器设为私有,用伴生对象控制实例创建。

class ApiKey private (val value: String)

object ApiKey {
  def from(value: String): Option[ApiKey] =
    if (value.nonEmpty) Some(new ApiKey(value)) else None
}

最佳实践

  • 默认保持 API 简洁,只公开调用者真正需要的成员
  • 对内部状态使用 private
  • 对继承扩展点使用 protected
  • 对模块内部工具方法使用包级私有
  • 不要为了方便测试而过度放开访问权限

小结

Scala 的访问控制比很多语言更灵活。掌握 privateprotectedprivate[this] 和包级私有,可以让代码边界更清晰,也更容易维护。