繁体   English   中英

在案例类中def vs lazy val

[英]def vs lazy val in case class

我有一个DAO对象,我将其定义为案例类。

case class StudentDAO(id: Int) {
  def getGPA: Double = // Expensive database lookup goes here
  def getRank: Int = // Another expensive database operation and computation goes here
  def getScoreCard: File = // Expensive file lookup goes here
}

我自然会使getGPAgetRankgetScoreCard def而不是val s因为我不想在它们被使用之前计算它们。

如果我将这些方法标记为lazy val s而不是def s,会对性能产生什么影响? 我想让他们lazy val的原因是:我不想每次为id为“i”的学生重新计算等级。

我希望这不会被标记为重复,因为有几个问题如下,主要是差异:

何时在Scala中使用val,def和lazy val?

def或val或lazy val用于语法规则?

Scala中的`def` vs`val` vs`lazy val`评估

斯卡拉懒惰的问题

这个问题主要针对的是费用(CPU与内存之间的权衡)使method成为昂贵的操作的lazy val ,以及为什么会提出其他建议?为什么?

编辑:感谢您对@ om-nom-nom的评论。 我应该更清楚我正在寻找什么。

我在这里读到:

使用lazy val缓存字符串表示

缓存对象的字符串表示(请参阅@Dave Griffith的回答 )。 更确切地说,如果我把它变成lazy val而不是def我正在研究垃圾收集的影响

对我来说似乎很简单:

我不希望它们在被使用之前被计算出来。 [...]我不想每次为id为“i”的学生重新计算排名。

然后使用lazy val ,就是这样。

当每次调用的值都可能改变时使用def ,通常是因为你传递参数, val不会改变,但会立即计算。

“普通”引用类型(例如, File )的lazy val具有在第一次评估时创建强引用的效果。 因此,虽然它将避免重新评估不变的值,但它具有将计算值保持在存储器中的明显成本。

对于原始值(甚至是轻量级对象,如File ),这种内存成本通常不是问题(除非你在内存中持有大量的Student对象)。 但是,对于重要的参考(例如,大型数据结构),您最好使用弱引用,其他一些缓存方法,或者只是按需计算值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM