[英]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
}
我自然会使getGPA
和getRank
和getScoreCard
def
而不是val
s因为我不想在它们被使用之前计算它们。
如果我将这些方法标记为lazy val
s而不是def
s,会对性能产生什么影响? 我想让他们lazy val
的原因是:我不想每次为id为“i”的学生重新计算等级。
我希望这不会被标记为重复,因为有几个问题如下,主要是差异:
Scala中的`def` vs`val` vs`lazy val`评估
这个问题主要针对的是费用(CPU与内存之间的权衡)使method
成为昂贵的操作的lazy val
,以及为什么会提出其他建议?为什么?
编辑:感谢您对@ om-nom-nom的评论。 我应该更清楚我正在寻找什么。
我在这里读到:
缓存对象的字符串表示(请参阅@Dave Griffith的回答 )。 更确切地说,如果我把它变成lazy val
而不是def
我正在研究垃圾收集的影响
对我来说似乎很简单:
我不希望它们在被使用之前被计算出来。 [...]我不想每次为id为“i”的学生重新计算排名。
然后使用lazy val
,就是这样。
当每次调用的值都可能改变时使用def
,通常是因为你传递参数, val
不会改变,但会立即计算。
“普通”引用类型(例如, File
)的lazy val
具有在第一次评估时创建强引用的效果。 因此,虽然它将避免重新评估不变的值,但它具有将计算值保持在存储器中的明显成本。
对于原始值(甚至是轻量级对象,如File
),这种内存成本通常不是问题(除非你在内存中持有大量的Student
对象)。 但是,对于重要的参考(例如,大型数据结构),您最好使用弱引用,其他一些缓存方法,或者只是按需计算值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.