2013-12-12 57 views
0

我希望能夠跟蹤某些狀態機(使用Akka FSM)完成的任務的數量,就像在狀態B中從狀態A到狀態B轉換時啓動N個操作一樣。所以當所有的均衡器在狀態B達到FSM時 - 它將進入狀態C.我創建了非常簡單的叉/加入狀態跟蹤器。斯卡拉案例類和私人構造函數元素

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 

    } 

我不喜歡有什麼 - 變種pewsense完成。由於它的本質,它是val,但是我不知道如何使私有val並初始化它在加入方法。

我認爲有一些方法可以使構造函數的參數爲​​私人,不能從外部訪問 - 但這是行不通的。

回答

4

無法將私有參數傳遞給case classes。它沒有任何意義,因爲case類的實例的身份是通過傳遞的構造函數參數定義的。私有構造函數參數會改變狀態,但不會影響等式比較和模式匹配。

你可以做的是使整個構造函數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 
} 
+0

但是這將允許我創建一個具有任意值的Forks實例來「完成」,這是我想要避免的。 – jdevelop

+0

我相應地改變了答案,這是否合適? – tmbo

1

這樣的事情?

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 
    } 
+0

(雖然我認爲在特質和對象的join()方法也可以返回'this') – Ashalynd

+0

通過這種方式,可以覆蓋當前連接的對象數量,並把它傳遞給美國,這是我真的想避免。 – jdevelop