Scala案例类私有构造函数不是私有的

时间:2016-06-29 10:53:02

标签: scala

今天我遇到了一个案例类构造函数的奇怪问题。我想让一个构造函数私有,似乎它不是问题。所以我在我的一个项目中尝试过它并且有效。但在另一个项目中,我可以调用私有构造函数并进行编译。我认为这是我的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

2 个答案:

答案 0 :(得分:11)

表示法val bar = Bar("12345")val bar = Bar.apply("12345")的简写,换句话说,它会调用案例类(自动生成的)companion objectapply方法。

伴侣对象可以访问私有构造函数,这就是它的工作原理。

(你为什么要制作一个案例类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