我有一个具有相当复杂状态的演员,但让我们说它是一个列表.我想出了以下示例:
class Account
class Bank extends Actor {
var accounts = List[Account]()
def receive = {
case x: Account =>
accounts ++= List(x)
println(accounts.length)
case _ =>
}
}
Run Code Online (Sandbox Code Playgroud)
基本上我希望这个actor包装List,我希望能够通过以下方式添加到该集合:
val system = ActorSystem("banks")
val bankActor = system.actorOf(Props[Bank], name = "mybank")
bankActor ! new Account
Run Code Online (Sandbox Code Playgroud)
我写这个演员甚至接近最佳和安全吗?有没有更好的方法,没有引入var?
有没有更好的方法,没有引入var?
在Actor中有可变状态(变量)是完全可以的.事实上,这是拥有演员的主要用例.Actor的可变状态是线程安全的,只有少数例外.主要是你不应该在演员的接收方法中的close over内部Future相互作用.
我同意在a var中使用a Actor很好.
作为替代方案,这里使用的另一种方法become避免了var.
class Bank extends Actor {
def receive = receiveAccounts(List.empty)
def receiveAccounts(accounts: List[Account]): Receive = {
case x: Account =>
println(accounts.length + 1)
context.become(receiveAccounts(x :: accounts))
case _ =>
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
321 次 |
| 最近记录: |