超越Supervisorstrategy作为具体演员的val

时间:2016-09-19 07:20:00

标签: scala akka actor supervisorstrategy

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

是否因为内存考虑因素,就像我们每次调用该方法时都不想要这个评估一样?

1 个答案:

答案 0 :(得分:1)

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

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