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
我认为我对 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