2011-10-26 21 views
4

我想知道是否有意義使用lazy val來防止不必要的堆分配,從而使GC的工作更容易一些。舉例來說,我在編寫代碼,像這樣的習慣:scala lazy val:在垃圾收集器上輕鬆上手的好方法?

lazy val requiredParameterObject = new Foo { 
    val a = new ... 
    val b = new ... 
    // etc 
} 

for (a <- collection) a.someFunction(requiredParameterObject) 

的這裏的想法是,通過使requiredParameterObject懶,我的情況下保存堆分配是collection是空的。但我想知道:lazy的內部細節是否使這不是一個有效的表現勝利?

回答

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) 

在上面Foo代碼時集合的第一項訪問它(1)創建一次 - 或從未如果集合是空的。

如果requiredParameterObject是一個普通函數,那麼只有在需要時纔會有效地調用requiredParameterObject。然而,它會將它稱爲集合中元素數量的很多倍。

3

A similar question在這裏問了一會兒,但有人指出lazy的實現在Scala編譯器版本之間有所不同。也許最權威的答案,你會得到這個問題是寫一個最小的片斷,如:通過您的scalac版本

def test(pred : Boolean) { 
    lazy val v = // ... 
    if (pred) 
    doSomething(v) 
} 

運行它,然後在用scalapjavap類文件偷看看看你會得到什麼。