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
?
是否因为内存考虑因素,就像我们每次调用该方法时都不想要这个评估一样?
答案 0 :(得分:1)
首先,scala trait
是一个保留我们知道通常需要覆盖的抽象定义的地方。因此,将方法定义为val
确实没有意义,除非该方法要由trait
的所有具体扩展调用。
通常,当我们使用trait
方法扩展def
时,我们会打开所有选项。也就是说,我们可以将其覆盖为def
,val
或lazy val
。
选择更多地取决于用例。
在这种情况下,我们不希望每次从akka子系统调用superVisorStrategy
方法时都会更改主管策略。因此,一旦该方法执行,我们希望保持未来的价值,从而节省一些内存。
因此,在大多数示例中,它被定义为val
或lazy val
。