我想知道是否有lazy val必要使用它来防止不必要的堆分配,从而使GC的工作更容易一些.例如,我习惯于像这样编写代码:
lazy val requiredParameterObject = new Foo {
val a = new ...
val b = new ...
// etc
}
for (a <- collection) a.someFunction(requiredParameterObject)
Run Code Online (Sandbox Code Playgroud)
这里的想法是,通过使requiredParameterObject懒惰,我在collection空的情况下保存堆分配.但我想知道:做内部细节lazy使得这不是一次有效的表现胜利吗?
你可以通过lazy val名字传递:
lazy val requiredParameterObject = new Foo {
val a = new ...
val b = new ...
// etc
}
class C {
def someFunction(f: => Foo) {
f //(1)
}
}
val collection = List(new C, new C)
for (a <- collection) a.someFunction(requiredParameterObject)
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,Foo当集合的第一项在(1)中访问它时创建一次- 或者如果集合为空则从不创建.
如果requiredParameterObject是普通函数,您可能也会得到更好的结果,requiredParameterObject只有在需要时才会有效地调用.但是,它会将其称为集合中元素数量的多次.