43

プライベート コンストラクターを持つ次のケース クラスがあり、コンパニオン オブジェクトの apply-method にアクセスできない場合。

case class Meter private (m: Int)

val m = Meter(10) // constructor Meter in class Meter cannot be accessed...

プライベート コンストラクターでケース クラスを使用し、生成された適用メソッドをコンパニオン パブリックに保持する方法はありますか?

私は、2 つのオプションに (私の例では) 違いがないことを認識しています。

val m1 = new Meter(10)
val m2 = Meter(10)

しかし、最初のオプションを禁止したいと思います。

- 編集 -

驚くべきことに、次のように動作します (しかし、実際には私が望むものではありません):

val x = Meter
val m3 = x(10) // m3  : Meter = Meter(10)
4

3 に答える 3

50

プライベートコンストラクターとパブリック apply メソッドを使用する手法を次に示します。

trait Meter {
  def m: Int
}

object Meter {   
  def apply(m: Int): Meter = { MeterImpl(m) }
  private case class MeterImpl(m: Int) extends Meter { println(m) }
}

object Application extends App {
  val m1 = new Meter(10) // Forbidden
  val m2 = Meter(10)
}

背景情報private-and-protected-constructor-in-scala

于 2013-11-17T13:10:22.080 に答える