lunes, 23 de mayo de 2016

Lazy Vals en Scala


Scala permite la palabra clave especial lazy delante de val con el fin de que no inicialice la constante con el valor, si no que este valor se calcule cuando realmente se necesite.

Es decir, si yo tengo lo siguiente:

lazy val a = 2 + 2
val b = a +2

En este caso a se va a calcular en la linea 2 y no en la 1.

Pero esto como funciona?

Dada la expresión 2 + 2, la expresión aún no se evalúa cuando estamos asignando. En el primer acceso (y sólo en la primer acceso) la expresión se evalúa y se devuelve como el resultado (4 en este caso). En cuanto a los accesos posteriores el resultado almacenado de la evaluación se almacena en caché y será devuelto en su lugar, nin necesidad de evaluar 2 veces.

Esta característica llamada "evaluate once" es muy fuerte. Sobre todo si tenemos en cuenta un escenario de multiproceso: Que debería ocurrir si dos subprocesos tienen acceso a nuestro val perezoso al mismo tiempo? Teniendo en cuentade que la evaluación se produce sólo una vez, tenemos que introducir algún tipo de sincronización con el fin de evitar una multiplicidad de evaluaciones de nuestra expresión. En la práctica, esto significa la expresión suma será evaluado por un hilo, mientras que el otro(s) tendrá que esperar hasta que la evaluación se ha completado, después puede ver el resultado evaluado.

Con la palabra  synchronized podemos decir que este campo sea sincronizado.