private 关键字在 class 定义中有不同的含义

private keyword has different meaning on class definition

我认为我对 Scala 有很好的理解,直到我发现自己处于这个简单的场景中

sealed abstract case class Name private(name: String)

object Name {
    def make(name: String): Option[Name] =
      if (name.nonEmpty) Some(new Name(name) {}) else None
  }

我的问题是关于 class 的 private 修饰符。 如果我这样使用它,一切正常,但是如果我在开始时移动 private 关键字,就像

private sealed abstract case class Name(name: String) 它没有编译因为给我以下错误

private class Name escapes its defining scope as part of type Option[example.package.Name]

其中 example.package 是我正在使用的包对象。

我想我需要一些说明,因为我不确定这里发生了什么

sealed abstract case class Name(name: String)

Name 有效地表示两者

  • class
  • 的名称
  • 那个 class
  • 的默认构造函数
sealed abstract case class Name private(name: String)

声明 class 是 public,但构造函数是私有的(即只能从 class 或其伴随对象中调用)。

private sealed abstract case class Name(name: String)

声明 class 是私有的(这意味着构造函数也是私有的)。

这段代码编译没有错误:

 private sealed abstract case class Name(name: String)

问题是您随后返回的值包含此 class 的 public 值,因此定义泄漏了,实际上并不是 private。您需要确保对 Name 的所有引用也是 private.

第一个语法将构造函数标记为私有;

sealed abstract case class Name private(name: String)

这意味着只能从 Name 伴随对象内部调用构造函数。所以这是不允许的

val name = new Name("name") // constructor Name in class Name cannot be accessed