gpt4 book ai didi

scala - 有什么方法可以避免在 Akka 伴随对象中定义 props 方法?

转载 作者:行者123 更新时间:2023-12-03 04:28:40 24 4
gpt4 key购买 nike

我正在使用 Akka 中已建立的代码库,并且经常看到这种模式:

class Bar(a: A, b: B, c: C) extends Actor {
// body of actor
}

object Bar {
def props(a: A, b: B, c: C) = Props(new Bar(a = a, b = b, c = c)
}

但是 props 方法感觉很丑,就像 Java 中的 getter/setter 一样。有更好的方法吗?

我认为可以直接创建 Actor ,例如

var child = context.actorOf(Props(new Bar(a, b, c))

因为这并不比使用 props 的版本复杂多少:

var child =  context.actorOf(Bar.Props(a, b, c))

但是如果我理解 Deprecation of Closures Taking Props 上的这篇文章那么这是不好的做法。相反,他们主张使用:

var child = context.actorOf(Props(classOf[Bar], a, b, c))

但是,正如 Ryan 在下面概述的那样,这会遇到重构问题?

最佳答案

除了使 Props 创建更接近 actor 的类之外,它还可以避免意外关闭 actor 的 this 引用,就像您使用 Props( 时会发生的情况一样) new MyActor("foo")) 在另一个 actor 中。

请参阅most recent reference guide section on Props :

This also avoids the pitfalls associated with using the Props.apply(...) method which takes a by-name argument, since within a companion object the given code block will not retain a reference to its enclosing scope.

如果您确实不想使用伴生对象 .props 并希望在另一个 actor 中创建 Props,那么您应该使用此版本的 Prop 创建者的安全:

def apply(clazz: Class[_], args: Any*)

例如:

context.actorOf(Props(classOf[MyActor], "foo"))

明显的缺点是它不提供参数的类型检查。

关于scala - 有什么方法可以避免在 Akka 伴随对象中定义 props 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21297619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com