scala lazy val:垃圾收集器上的一个好方法吗?

Lan*_*uhn 4 scala

我想知道是否有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使得这不是一次有效的表现胜利吗?

Tom*_*icz 5

你可以通过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只有在需要时才会有效地调用.但是,它会将其称为集合中元素数量的多次.