将def与val用于常量值有什么含义

时间:2011-11-23 10:36:30

标签: function scala immutability idiomatic

在Scala中使用defval定义常量不可变值有什么影响?我显然可以写下以下内容:

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

这两个陈述之间有什么区别?哪一个表现更好/是推荐的方式/更惯用?我何时才能使用其中一个?

2 个答案:

答案 0 :(得分:11)

假设这些是类级声明:

编译器将生成val final,这可以导致VM更好地优化代码。

def不会将值存储在对象实例中,因此会节省内存,但每次都需要对方法进行评估。

为了两全其美,请创建一个伴随对象,并在那里将常量声明为val

即。而不是

class Foo {
  val MyConstant = 42
}

这样:

class Foo {}

object Foo {
  val MyConstant = 42
}

答案 1 :(得分:1)

val被评估一次并存储在一个字段中。 def作为方法实现,并且每次都重新评估,但不使用内存空间来存储结果值。