2011-11-23 16 views
9

¿Cuáles son las implicaciones de usar def contra val en Scala para definir un valor constante e inmutable? Obviamente, puedo escribir lo siguiente:¿Cuáles son las implicaciones de usar def vs. val para valores constantes

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

¿Cuál es la diferencia entre esas dos afirmaciones? ¿Cuál se comporta mejor/es el modo recomendado/más idiomático? ¿Cuándo usaría uno sobre el otro?

Respuesta

9

Suponiendo que estos son declaraciones de nivel de clase:

El compilador hará una valfinal, que puede conducir a código más optimizada por la máquina virtual.

A def no almacenará el valor en la instancia del objeto, por lo que guardará la memoria, pero requiere que el método se evalúe cada vez.

Para lo mejor de ambos mundos, haga un objeto complementario y declare las constantes como val s allí.

es decir, en lugar de

class Foo { 
    val MyConstant = 42 
} 

esto:

class Foo {} 

object Foo { 
    val MyConstant = 42 
} 
+0

»Will ahorrar memoria«? El valor tiene que almacenarse _en alguna parte_, no veo por qué una forma requeriría más memoria que la otra ...? – knittl

+2

@knittl Si tiene mil instancias, un campo se almacenará mil veces. Una definición de método solo se almacena una vez. –

+0

Ah, vale, ¡eso tiene sentido! – knittl

1

El val se evalúa una vez y se almacena en un campo. El def se implementa como un método y se reevalúa cada vez, pero no utiliza espacio de memoria para almacenar el valor resultante.

Cuestiones relacionadas