1

Scala 中的Actortrait 是这样定义的,

/**
* 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?

是因为内存方面的考虑,比如我们不希望每次调用该方法时都进行此评估吗?

4

1 回答 1

1

所以首先,scalatrait是一个保存我们知道通常需要覆盖的抽象定义的地方。因此,将方法定义为 确实没有意义val,除非该方法旨在由该方法的所有具体扩展调用trait

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

于 2016-09-19T07:40:28.653 回答