2016-09-19 29 views
1

Scala中Actor性状像这样定义,重写Supervisorstrategy作为混凝土演员一个VAL

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

看看[这里](http://stackoverflow.com/questions/19642053/when-to-use-val-or-def-in-scala-traits)。 –

回答

1

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

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