今天我遇到了一个案例类构造函数的奇怪问题。我想让一个构造函数私有,似乎它不是问题。所以我在我的一个项目中尝试过它并且有效。但在另一个项目中,我可以调用私有构造函数并进行编译。我认为这是我的ide的东西,所以我创建了一个独立的类并用scalac编译它。它编译。这是代码:
package com.test
object Main {
def main(args: Array[String]) {
val bar = Bar("12345")
// bar.doStuff()
println(bar)
}
}
case class Bar private(foo: String){
private def doStuff():Unit = println("stuff")
}
有趣的是,如果我取消注释bar.doStuff(),它将无法编译。所以我假设在这种情况下私有工作,但不知何故不适用于构造函数。我究竟做错了什么? Scalac是2.11.8
答案 0 :(得分:11)
表示法val bar = Bar("12345")
是val bar = Bar.apply("12345")
的简写,换句话说,它会调用案例类(自动生成的)companion object的apply
方法。
伴侣对象可以访问私有构造函数,这就是它的工作原理。
(你为什么要制作一个案例类private
的构造函数?这听起来不是一个好主意。)
答案 1 :(得分:3)
如果您希望Bar("abc")
无法编译,这是一个简单的解决方法。
在2.12.3中快速测试。不适用于2.11.8
case class Bar private (value: String)
object Bar {
private def apply(v: String) = new Bar(v) // makes the method private
def create(value: String): Bar = ... // your own implementation
}
val bar = Bar("abc") // compile error
val bar = new Bar("abc") // compile error
val bar = Bar.create("abc") // ok