Akka和我相互认识。
来自:Akka 2.3.6 (current) Actor Recommended Practice
这是一个名为DemoActor的示例actor:
class DemoActor(magicNumber: Int) extends Actor {
def receive = {
case x: Int => sender() ! (x + magicNumber)
}
}
在文档的推荐实践部分中,它指出:"最好在每个Actor的配对对象上提供工厂方法,以帮助保持合适的创建道具尽可能接近演员的定义。" 他们这样做:
object DemoActor {
def props(magicNumber: Int): Props = Props(new DemoActor(magicNumber))
}
问题:为道具方法指定工厂之间的区别如下:
object DemoActor {
def props(magicNumber: Int): Props = Props(classOf[DemoActor], magicNumber)
}
如果你错过了它,差异就是Props构造函数的参数:
new DemoActor(magicNumber)
VS
classOf[DemoActor], magicNumber
在Props section中的同一个akka文档页面中,它在使用Props(classOf[ActorWithArgs], "arg1"
时也会提及:
"在构造Props对象期间验证是否存在匹配的构造函数,如果找不到或找到多个匹配的构造函数,则会导致IllegalArgumentEception。"
那很好,不是吗?!?.... ....
答案 0 :(得分:10)
那很好,不是吗?!?....
是的,但如果在编译期间可以捕获错误,那就更好了。直接调用构造函数的优点是编译器将捕获没有匹配构造函数的问题,而不是在运行时抛出异常。
关于Props
apply
方法的一个有趣的事情是,当你写:
Props(new DemoActor(magicNumber))
创建Props实例时,不会立即调用actor的构造函数。构造函数调用按名称传递,而不是按值传递。您可以在Props
apply
方法的签名中看到此内容:
def apply[T <: Actor](creator: ⇒ T)(implicit arg0: ClassTag[T]): Props
注意creator参数中的右箭头。这允许创建者构造被推迟,并且可能在远程演员的另一个过程中执行。
此处存在潜在危险,如果new
操作在范围内关闭并捕获不打算序列化或不可序列化的值,从而使Props对象也不可序列化。这就是文档建议在actor的伴随对象中执行此操作的原因 - 以最小化关闭不打算序列化的数据的风险。