2011-11-23 13 views
9

Quali sono le implicazioni dell'uso di def rispetto a val in Scala per definire un valore costante e immutabile? Ovviamente posso scrivere quanto segue:Quali sono le implicazioni dell'uso di def vs. val per i valori costanti

val x = 3; 
def y = 4; 
var a = x + y; // 7 

Qual è la differenza tra queste due affermazioni? Quale si comporta meglio/è il modo consigliato/più idiomatico? Quando dovrei usare uno sull'altro?

risposta

9

Assumendo questi sono dichiarazioni a livello di classe:

Il compilatore farà un valfinal, che può portare a codice migliore ottimizzata dalla VM.

A def A non memorizza il valore nell'istanza dell'oggetto, quindi verrà salvata la memoria, ma il metodo deve essere valutato ogni volta.

Per il meglio di entrambi i mondi, creare un oggetto companion e dichiarare le costanti come val s lì.

cioè invece di

class Foo { 
    val MyConstant = 42 
} 

questo:

class Foo {} 

object Foo { 
    val MyConstant = 42 
} 
+0

»Volontà di memoria«? Il valore deve essere memorizzato _somewhere_, non vedo perché una forma richiederebbe più memoria dell'altra ...? – knittl

+2

@knittl Se hai mille istanze, un campo verrà memorizzato migliaia di volte. Una definizione di metodo viene memorizzata solo una volta. –

+0

Ah ok, questo ha senso! – knittl

1

Il numero val viene valutato una volta e memorizzato in un campo. Lo standard def viene implementato come metodo e viene rivalutato ogni volta, ma non utilizza lo spazio di memoria per memorizzare il valore risultante.

Problemi correlati