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)