目前,我有一个接收一些消息的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(在我的第一个例子中)是非常"合法的" ?
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.