你应该避免Akka演员的可变状态吗?

MyT*_*tle 0 scala akka

目前,我有一个接收一些消息的actor,并将此消息的内容保存到可变的类级变量中:

class MyActor extends Actor {

    val items1: Seq[Item] = _ 
    val items2: Seq[Item] = _

    def receive = {
       case Start(items1, items2) => 
         items1= items1
         items2 = items2

       case Result(...) => ...
    } 

    private  def method1(args...) = {
       // do something with items1 and items2
    }

    private  def method2(args...) = {
       // do something with items1 and items2
    }

}
Run Code Online (Sandbox Code Playgroud)

我读到创建几个receive函数并使用context.become/ unbecome来处理不同的状态真的很棒.所以在我的情况下我可以使用这样的receive函数:

   def running(items1: Seq[Item], items2: Seq[Item]): Receive = {
      case Result(...) => ...
   }

   val waiting: Receive = {
       case Start(items1, items2) =>
          context.become(running(items1, items2))
          start( )
   }
Run Code Online (Sandbox Code Playgroud)

这种方法在我看来非常清楚和好看,但问题是我有其他方法(method1和method2)需要这个items1和items2变量.唯一可能的解决方法我想到的是通过items1和items2以method1和method2为功能,但是这种方法已经有2-3个参数,并增加更多的参数给他们会让他们难以阅读(其实我有2点以上的方法).

那么,在这种情况下Akka有任何模式吗?或者,拥有类级别var(在我的第一个例子中)是非常"合法的" ?

Rad*_*ian 6

So, is there any patterns in Akka for such cases? 
Run Code Online (Sandbox Code Playgroud)

我不知道.

Or it's pretty 'legal' to have class-level vars (as in my first example)?
Run Code Online (Sandbox Code Playgroud)

var内部演员是好的,只要你不从封闭或未来访问它们.

但是,我建议您选择参数解决方案.如果您的参数列表变得很长,您可以考虑将它们分组为case classes.