2016-08-23 5 views
1

Berücksichtigt regulärval s (nicht lazy one) - wann werden sie genau ausgewertet?Wann werden Vals genau ausgewertet?

Für Klassen und Singleton-Objekte, glaube ich, ist dies, wenn die Klasse/Objekt instanziiert wird. Und für Eigenschaften, wenn eine Klasse, die diese Eigenschaft implementiert, instanziiert wird. Für Paketobjekte bin ich mir nicht sicher.

class Test { 
    val someList = (1 to 1000) // evaluated when it's Test is instantiated 
} 

object Test { 
    val someList = (1 to 1000) // evaluated when Test gets instantiated 
} 

trait Test { 
    val someList = (1 to 1000) // evaluated when a class implementing Test is instantiated 
} 

package object Test { 
    val someList = (1 to 1000) // ??? 
} 

auch gegeben, dass ein def und lazy val beide ausgewertet werden, wenn zuerst zugegriffen wird, der einzige wesentliche Unterschied zwischen ihnen, dass die val nur einmal ausgewertet wird?

class Test { 
    lazy val someList = (1 to 1000) // evaluated at access time, once 
    def someList = (1 to 1000) // evaluated at access time for each access 
} 

Aus Performance-Sicht ist meine derzeitige Annahme, dass es zwischen dem ersten Zugriff eines def oder val (von der gleichen Sache), aber nachfolgende Zugriffe eines bereits ausgewertet val wird schneller sein im Wesentlichen keinen Unterschied (angenommen, was auch immer ausgewertet wird, ist messbar groß).

Daher, wenn ich eine große Liste habe, die ich nur einmal bewerten muss, dann sollte ich eine val verwenden (und wenn nicht sicher, dass es jemals verwendet wird, und die Leistung des ersten Zugriffs ist kein Problem für mich dann a lazy eins)?

Antwort

3

Ja, alles korrekt. Paketobjekte verhalten sich bei der Initialisierung wie normale Objekte.

+0

Prost für die Bestätigung. – Nio

Verwandte Themen