16.3.2 Actor 的创建
访问 Actor 的方法和访问普通对象的方法有所不同。
我们从来都不会得到 Actor
的实例,从不调用 Actor
的方法,也不直接改变 Actor
的状态,反之,只向 Actor
发送消息。
除此之外,我们也不会直接访问 Actor
的成员,而是通过消息传递来请求获取关于 Actor
状态的信息。
使用消息传递代替直接方法调用可以加强封装性。
通过使用基于消息的方法,我们可以相当完整地将 Actor
的实例封装起来。
如果只通过消息进行相互通信的话,那么永远都不会需要获取 Actor
的实例。Actor
发送消息并接收响应。
在 Akka 中,这个指向
Actor
实例的引用叫做ActorRef
。ActorRef
是一个无类型的引用,将其指向的Actor
封装起来,提供了更高层的抽象,并且给用户提供了一种与Actor
进行通信的机制。
Actor
系统就是包含所有 Actor
的地方。
有一点可能相当明显:我们也正是在 Actor
系统中创建新的 Actor
并获取指向 Actor
的引用。actorOf
方法会生成一个新的 Actor
,并返回指向该 Actor
的引用。
val actor: ActorRef = actorSystem.actorOf(Props(classOf[HelloActor]))
Actor
都被封装起来了,不能够被直接访问。我们不能从外部代码中直接访问 Actor
的状态。
Props
为了保证能够将 Actor
的实例封装起来,不让其被外部直接访问,我们将所有构造函数的参数传给一个 Props
的实例。
Props
允许我们传入 Actor
的类型以及一个变长的参数列表。
Props(classOf[HelloActor], arg1, arg2, argn)