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)?
Prost für die Bestätigung. – Nio