2013-12-12 6 views
0

Я хочу, чтобы иметь возможность отслеживать количество заданий, выполненных на каком-то государственном компьютере (с использованием Akka FSM), это похоже на объединение N действий, начатых при переходе из состояния A в B, в состоянии B. Поэтому, когда все эвены достигают FSM в состоянии B, он переходит в состояние C.Scale case class и private constructor element

Я создал очень простой трекер для состояний 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 

    } 

Что мне не нравится там - pewsense из вара закончил. По своей природе это val, однако я понятия не имею, как сделать частный val и инициализировать его в join метод.

Я думал, что есть способ сделать аргумент конструктора как приватным, не доступным извне - но это не сработает.

ответ

4

Невозможно передать приватные аргументы case classes. Это не имеет смысла, потому что идентичность экземпляра класса case определяется по аргументам переданного конструктора. Аргумент частного конструктора изменит состояние, но не повлияет ни на сравнение сравнений, ни на соответствие шаблону.

Что вы можете сделать, это сделать весь конструктор 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 
} 
+0

, но это позволит мне создать экземпляр вилок с произвольным значением для «законченного», которого я хочу избежать. – 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

Смежные вопросы