Scala 作为具体参与者的val的凌驾监督策略

Scala 作为具体参与者的val的凌驾监督策略,scala,akka,akka-supervision,akka-actor,Scala,Akka,Akka Supervision,Akka Actor,Scala中的Actor特征定义如下: /** * User overridable definition the strategy to use for supervising * child actors. */ def supervisorStrategy: SupervisorStrategy = SupervisorStrategy.defaultStrategy 但是我看到所有具体参与者的示例代码定义如下: override val supervisorStrategy = One

Scala中的
Actor
特征定义如下:

/**
* 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
,实际上没有意义,除非该方法是由该
特性的所有具体扩展调用的

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

看看。