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