在案例类中def vs lazy val

Ven*_*ama 2 scala function lazy-evaluation

我有一个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
}
Run Code Online (Sandbox Code Playgroud)

我自然会制作getGPAgetRankgetScoreCard def不是vals因为我不希望它们在被使用之前被计算出来.

如果我将这些方法标记为lazy vals而不是defs,会对性能产生什么影响?我想让它们成为lazy vals 的原因是:我不想每次为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

vpt*_*ron 9

对我来说似乎很简单:

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

然后使用lazy val就是这样.

def当每个调用的值可能发生变化时使用,通常是因为传递参数,val不会改变,但会立即计算.

  • 如果值可以重新计算但你想保持计算值,除非GC需要内存,看看`WeakReference` (3认同)