在Scala中使用def
与val
定义常量不可变值有什么影响?我显然可以写下以下内容:
val x = 3;
def y = 4;
var a = x + y; // 7
这两个陈述之间有什么区别?哪一个表现更好/是推荐的方式/更惯用?我何时才能使用其中一个?
答案 0 :(得分:11)
假设这些是类级声明:
编译器将生成val
final
,这可以导致VM更好地优化代码。
def
不会将值存储在对象实例中,因此会节省内存,但每次都需要对方法进行评估。
为了两全其美,请创建一个伴随对象,并在那里将常量声明为val
。
即。而不是
class Foo {
val MyConstant = 42
}
这样:
class Foo {}
object Foo {
val MyConstant = 42
}
答案 1 :(得分:1)
val
被评估一次并存储在一个字段中。 def
作为方法实现,并且每次都重新评估,但不使用内存空间来存储结果值。