scala - Actor 消息应该扩展一个共同的特征吗?

标签 scala actor akka

在正确使用 scala(和 akka)actor 框架的大多数示例中,人们倾向于从单个特征派生每条消息。例如:

trait Message
object Ping extends Message
object Pong extends Message

但是,在 Scala 和 Akka 中,根本没有键入消息接收。有什么理由来实现一个共同的特征吗?

最佳答案

这实际上取决于您要实现的目标。例如,我最近使用具有多种类型角色的角色和一个或多或少像路由器一样工作的管理角色构建了一个小型应用程序。现在,工作 Actor 可以收到许多不同的消息,例如 Foo , BarBaz .没有父类(super class)型,在管理 Actor 中,我必须写这样的东西:

react {
    case x:Foo | x:Bar | x:Baz => worker ! x
}

这显然是不必要的冗长。所以在这种情况下,父类(super class)型 WorkerMessage会很有意义,因为它简化了您的代码:
react {
    case x:WorkerMessage => worker ! x
}

另一方面,这使得消息 Foo , BarBaz除了被您的 WorkerActor 使用之外,几乎无法用于任何其他目的。如果您有留言 StopInit例如,这可能很糟糕,因为您需要在整个地方重新定义它。

所以如果你知道你只有不传递消息的 Actor (也就是说,他们自己处理它们),那么我猜你没有父类(super class)型就可以了。

我猜人们在默认情况下或多或少这样做的原因是,如果您以后更改代码,则不必在之后创建特征,因为您已经在开始时这样做了。

就我个人而言,我总是尽量避免不必要的开销,所以除非我真的需要,否则我可能不会定义父类(super class)型。另外,我真的不知道创建父类(super class)型是否对性能有任何影响,但我很想知道。

关于scala - Actor 消息应该扩展一个共同的特征吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6322437/

相关文章:

scala - Akka 2 中调度程序的区别和使用模式有哪些?

tomcat - Tomcat7 中的 Akka 应用程序未发送响应

scala - gradle 4.3 修复了 play 2.6.6 和 scala 2.12 的问题吗?

list - Scala:为什么 foldLeft 不能用于两个列表的连接?

java - Akka Actor 意外地清理了它的状态

concurrency - seda 和 actor 模型本质上是等价的吗?

java - 路由池中的 context().parent()

scala - 在 IntelliJ 中运行 ScalaTest 时“无法加载 Suite 类”

scala - 如何收集错误是scala,然后将所有错误汇总在一起

scala - 如何在运行测试之前启动 docker 容器