繁体   English   中英

Scala案例类和私有构造函数元素

[英]Scala case class and private constructor element

我希望能够跟踪在某些状态机(使用Akka FSM)中完成的任务的数量,就像加入N个动作一样,它是从状态A到状态B的转换,在状态B中开始的。因此,当所有偶数都到达状态B的FSM时-进入状态C。

我为fork / join状态创建了非常简单的跟踪器。

  sealed trait ForkJoin {

    def join(): ForkJoin

  }

  case class Forks(forkNum: Int) extends ForkJoin {

    private var finished: Int = 0

    override def join = if (finished + 1 == forkNum) JoinComplete
    else {
      val f = Forks(forkNum)
      f.finished = finished + 1
      f
    }

  }

  case object JoinComplete extends ForkJoin {

    override def join = JoinComplete

  }

我不喜欢那里-变种的感觉完蛋了 从本质上讲 ,它是val ,但是我不知道如何制作一个私有val并在join方法中对其进行初始化。

我以为有一种方法可以将构造函数参数设为私有 ,不能从外部访问-但这不起作用。

无法将私有参数传递给case classes 这没有任何意义,因为案例类实例的标识是在传递的构造函数参数上定义的。 私有构造函数参数将更改状态,但不会影响相等比较或模式匹配。

您可以做的是使整个构造函数private 为了正确地作为FSM状态运行,您可能需要自己实现equalshashCode [1]

sealed trait ForkJoin {
  def join(): ForkJoin
}

case class Forks private(forkNum: Int, finished: Int) extends ForkJoin{

  override def join =
    if (finished + 1 == forkNum)
      JoinComplete
    else
      Forks(forkNum, finished + 1)

  def copy(forkNum: Int = this.forkNum) = 
    Forks(forkNum, finished)

}

object Forks{
  def apply(forkNum: Int): Forks = Forks(forkNum, 0)
}

object JoinComplete extends ForkJoin {
  override def join = JoinComplete
}

这样的东西?

sealed trait ForkJoin {
    def join(): ForkJoin
 }

  case class Forks(forkNum: Int, finished: Int = 0) extends ForkJoin {
    override def join = if (finished + 1 == forkNum) JoinComplete
    else Forks(forkNum, finished + 1)
   }

  case object JoinComplete extends ForkJoin {
    override def join = JoinComplete
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM