对常量值使用 def 与 val 有何影响
Posted
技术标签:
【中文标题】对常量值使用 def 与 val 有何影响【英文标题】:What are the implications of using def vs. val for constant values 【发布时间】:2012-01-04 15:48:00 【问题描述】:在 Scala 中使用 def
与 val
定义一个常量、不可变值有什么含义?我显然可以写以下内容:
val x = 3;
def y = 4;
var a = x + y; // 7
这两种说法有什么区别?哪一个表现更好/推荐的方式/更惯用?我什么时候会使用其中一个?
【问题讨论】:
【参考方案1】:假设这些是类级别的声明:
编译器会生成一个val
final
,这可以让VM更好地优化代码。
def
不会将值存储在对象实例中,因此会节省内存,但需要每次都对方法进行评估。
为了两全其美,创建一个伴生对象并将常量声明为val
s。
即而不是
class Foo
val MyConstant = 42
这个:
class Foo
object Foo
val MyConstant = 42
【讨论】:
»会节省内存«?该值必须存储在某处,我不明白为什么一种形式需要比另一种形式更多的内存......? @knittl 如果你有一千个实例,一个字段将被存储一千次。一个方法定义只存储一次。 也许def
也存储在 permgen 中,而 val 将存储在堆中?不知道静态成员去哪了。【参考方案2】:
val
被评估一次并存储在一个字段中。 def
是作为方法实现的,每次都会重新计算,但不使用内存空间来存储结果值。
【讨论】:
以上是关于对常量值使用 def 与 val 有何影响的主要内容,如果未能解决你的问题,请参考以下文章