java - 什么时候在 Scala 中使用惰性值?

标签 java scala jvm

为什么 Scala 引入惰性参数。它不应该由 JVM 管理(对用户不可见)如何初始化值吗?值得将控制权交给开发人员并将值定义为惰性值的真实世界用例是什么?

最佳答案

别名参数:主要动机之一是支持 dsls。它们允许您在 API 中拥有非常好的语法,几乎感觉就像它们内置在语言中一样。例如,您可以非常轻松地定义自己的自定义 repeat -循环:

def repeat(body: =>Unit)(until: =>Boolean): Unit = {
  body
  if (until) {} else repeat(body)(until)
}

然后把它当作语言的一部分来使用。

var i = 0
repeat {
  println(i)
  i += 1
} (i < 3)

或者您可以像这样生成一个新线程:spawn { println("on the new thread!") } ,或者您可以对 FileInputStream 进行自动资源管理就像这样:withFile("/home/john/.bashrc") { println(_.contents) } .

lazy值(value)观 - 这里的动机是:

  1. 惰性数据结构,如 Stream s在函数式语言中很流行,您可以使用它们来实现高效的数据结构,例如 Okasaki 的函数式队列。
  2. 避免分配或初始化一些从未在某些对象中使​​用过的昂贵资源,例如文件句柄或数据库连接。
  3. 初始化objects fields in the correct order , 对于由许多 mixin 组成的对象。
  4. 当有多个线程共享一个值时实现正确的“仅初始化一次”语义(参见 introduction here)。
  5. 为嵌套单例对象制定翻译方案:

class A { object B }

变成这样:

class A {
  class A$B$
  lazy val B = new A$B$
}

关于java - 什么时候在 Scala 中使用惰性值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19955995/

相关文章:

java - 我无法使用 iCal4j 正确设置 Activity 日期

Java程序在Windows下运行但在Mac OS JVM中失败

java - 忽略非转义字符的 CharacterData

java - 使用 ADFS 和 SAML 通过 Java 查询 AD

java - 旧的堆生成空间在 Scala 中没有被垃圾收集

scala - Spark 将 sql 窗口函数迁移到 RDD 以获得更好的性能

scala - 为什么 chisel UInt(32.W) 不能取 bit[32] 恰好为 1 的无符号数?

compiler-errors - 重定位被截断以适应错误 : R_X86_64_32 against symbol

memory - 我想从内存中删除 PrivateKey (sun.security.rsa.RSAPrivateCrtKeyImpl) 的 secret 信息?

java - 在使用 gradle 构建 Kotlin 应用程序时,在 Jar 中找不到主类