将 Supervisorstrategy 重写为具体 Actor 中的一个 val

Overriding Supervisorstrategy as a val in concrete Actor

Scala 中的 Actor trait 是这样定义的,

/**
* User overridable definition the strategy to use for supervising
* child actors.
*/
def supervisorStrategy: SupervisorStrategy = SupervisorStrategy.defaultStrategy

但是我看到所有具体参与者的示例代码都定义如下,

override val supervisorStrategy = OneForOneStrategy(loggingEnabled = false) {
    ...
  }

我想了解的是为什么 supervisorStrategy 被覆盖为 val
为什么不将其覆盖为 def

是不是内存方面的考虑,比如我们不想每次调用方法时都求值?

所以首先在 scala trait 上放置我们知道通常需要覆盖的抽象定义。因此,将方法定义为 val 确实没有意义,除非该方法旨在被 trait.

的所有具体扩展调用。

通常,当我们使用 def 方法扩展 trait 时,我们会打开所有选项。也就是说,我们可以将其覆盖为 defvallazy val。 选择更多地取决于用例。 在这种情况下,我们不希望每次从 akka 子系统调用 superVisorStrategy 方法时,主管策略都会改变。因此,一旦该方法执行完毕,我们希望保留未来的价值,从而节省一些内存。 因此,在大多数示例中,它被定义为 vallazy val