scala-akka参与者:消息可以是字符串类型吗

scala-akka参与者:消息可以是字符串类型吗,scala,akka,Scala,Akka,有人告诉我,不应该向参与者传递字符串,而应该只传递对象。这背后有什么原因吗 以下代码片段对我来说很好?有什么问题吗 class MyActor extends Actor { def onRecieve(): Unit { case "xyz" => // do something } } class Main { // create a actor systesm // create a worker of type MyActor worker! "xyz

有人告诉我,不应该向参与者传递字符串,而应该只传递对象。这背后有什么原因吗

以下代码片段对我来说很好?有什么问题吗

class MyActor extends Actor {
   def onRecieve(): Unit {
     case "xyz" => // do something
   }
}

class Main {
 // create a actor systesm
 // create a worker of type MyActor
 worker! "xyz"
}

Scala中的字符串(实际上是java.lang.String)是对象。字符串还实现java.io.Serializable,Akka需要它来处理消息。不过,一般来说,最好是Akka参与者接收案例类或案例对象的消息。这是因为actor的receive()方法进行模式匹配,它需要使用unapply()解构对象。这就是case类所提供的。对于case对象,仍然可以在类型本身上进行模式匹配。当然,字符串文本上的模式匹配在技术上也应该有效。

字符串可能拼写错误,不能包含参数(除非您开始解析字符串),编译器也不能检查缺少的大小写

要使用案例类检查缺少的案例,请让案例类消息全部扩展一个密封的特征,然后首先匹配该特征,然后对该特征的子类型进行嵌套匹配。然后,如果您没有处理该特征的所有子类型,您应该得到警告


但是,字符串确实可以作为消息使用。案例类有一些优点,但字符串可以工作。

简短的回答是:是的,字符串是发送给Akka参与者的完全有效的消息(当然,在Akka类型中,这只对
ActorRef[string]
ActorRef[AnyRef]
ActorRef[Any]
(或
ActorRef[T]有效)
考虑到从
String
T
的隐式转换,这三者中至少有两个是非常奇怪的……对于
ActorRef[AnyRef]
ActorRef[Any]
来说,唯一可能的参数行为就是忽略每条消息)

但是,请记住:

字符串是一个严格的数据结构,它传递到的任何地方都有大量的过程重复。它是隐藏信息的完美工具

为了从字符串中提取含义,通常必须对其进行解析:即使是高效的解析器,其效率也可能低于对象图中的以下引用,但这些解析器通过对试图理解发生了什么的任何人施加沉重的认知负载来弥补这一效率低下