2016-09-19 3 views
1

Actor черты Scala определяется как так,Переопределения Supervisorstrategy как вал в бетоне Актера

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

Обычно, когда мы продлеваем trait с помощью метода def, у нас есть все возможности для открытия. То есть мы можем переопределить его как def, a val или lazy val. Выбор зависит от варианта использования чаще. В этом случае мы не ожидаем, что стратегия супервизора будет меняться каждый раз, когда вызывается метод superVisorStrategy из подсистемы akka. Таким образом, как только метод будет выполнен, мы хотим сохранить ценность для будущего, таким образом, сохраняя некоторую память. Следовательно, в большинстве примеров он определен как val или lazy val.

Смежные вопросы