Каковы последствия использования def против val для постоянных значений - PullRequest
10 голосов
/ 23 ноября 2011

Каковы последствия использования def против val в Scala для определения постоянного неизменного значения? Я, очевидно, могу написать следующее:

val x = 3;
def y = 4;
var a = x + y; // 7

В чем разница между этими двумя утверждениями? Какой из них работает лучше / это рекомендуемый способ / более идиоматический? Когда бы я использовал один поверх другого?

Ответы [ 2 ]

11 голосов
/ 23 ноября 2011

Предполагая, что это объявления уровня класса:

Компилятор создаст val final, что может привести к лучшему оптимизированию кода виртуальной машиной.

A def не будет хранить значение в экземпляре объекта, поэтому сохранит память, но требует, чтобы метод оценивался каждый раз.

Для лучшего из обоих миров создайте объект-компаньон и объявите константы как val s там.

то есть вместо

class Foo {
  val MyConstant = 42
}

это:

class Foo {}

object Foo {
  val MyConstant = 42
}
1 голос
/ 23 ноября 2011

val оценивается один раз и сохраняется в поле.def реализован как метод и каждый раз переоценивается, но не использует пространство памяти для хранения результирующего значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...