对常量值使用 def 与 val 有何影响

Posted

技术标签:

【中文标题】对常量值使用 def 与 val 有何影响【英文标题】:What are the implications of using def vs. val for constant values 【发布时间】:2012-01-04 15:48:00 【问题描述】:

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

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

这两种说法有什么区别?哪一个表现更好/推荐的方式/更惯用?我什么时候会使用其中一个?

【问题讨论】:

【参考方案1】:

假设这些是类级别的声明:

编译器会生成一个valfinal,这可以让VM更好地优化代码。

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

为了两全其美,创建一个伴生对象并将常量声明为vals。

即而不是

class Foo 
  val MyConstant = 42

这个:

class Foo 

object Foo 
  val MyConstant = 42

【讨论】:

»会节省内存«?该值必须存储在某处,我不明白为什么一种形式需要比另一种形式更多的内存......? @knittl 如果你有一千个实例,一个字段将被存储一千次。一个方法定义只存储一次。 也许def 也存储在 permgen 中,而 val 将存储在堆中?不知道静态成员去哪了。【参考方案2】:

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

【讨论】:

以上是关于对常量值使用 def 与 val 有何影响的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin - 常量与变量

在 32 位系统上使用 int64_t 而不是 int32_t 对性能有何影响?

通用选择器对性能有何影响?

静态集合中存储函数对系统有何影响?

电路中Re起何作用?它的大小对电路性能有何影响

在 Rails 3 应用程序中使用 require_dependency 对性能有何影响?