[英]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状态运行,您可能需要自己实现equals
和hashCode
[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.