2011-07-28 18 views
9

Desde el REPL:Adición de tipo explícita a val val evita que se utilice como una constante en la anotación

scala> final val x = "x" 
x: java.lang.String("x") = x 

scala> @javax.persistence.Table(name = x) case class foo() 
defined class foo 

scala> final val x:java.lang.String = "x" 
x: java.lang.String = x 

scala> @javax.persistence.Table(name = x) case class foo() 
<console>:6: error: annotation argument needs to be a constant; found: x 
     @javax.persistence.Table(name = x) case class foo() 

¿Puede alguien explicar por qué esto sólo funciona sin un tipo?

+0

¿Por qué usa la palabra clave 'final'? – paradigmatic

+0

final es necesario para crear la constante literal que Daniel menciona a continuación. Sin él, obtendrá el mismo error mencionado anteriormente. – scalapeno

Respuesta

8

Sin el tipo, final val actúa como una constante literal: el identificador se reemplaza por su valor en tiempo de compilación. Con el tipo, se convierte en una referencia a algo almacenado en algún lugar, que no se puede usar en las anotaciones.

Esto se define en la sección 4.1 de la especificación:

Una definición valor constante es de la forma

final val x = e 

donde e es una expresión constante (§6.24). El modificador final debe ser presente y no se puede dar ninguna anotación de tipo. Las referencias al valor constante x se tratan a sí mismas como expresiones constantes; en el código generado se reemplazan por el lado de la derecha de la definición e.

Esta es la única manera en que puede obtener verdaderas constantes con nombre en Scala. Tienen beneficios de rendimiento, están realmente garantizados para no mutar (incluso un final val con un tipo se puede cambiar a través de la reflexión) y, por supuesto, se pueden utilizar en las anotaciones.

+0

Supuse que eso era lo que estaba pasando, pero ¿por qué funciona así? ¿Hay algún beneficio al hacerlo de esa manera? ¿Hay algún caso en que esta sea una característica útil? – scalapeno

+0

@ tritium6 Expandí mi respuesta, pero ¿no se usa en las anotaciones un caso suficientemente útil? –

+0

Gracias por la expansión. Tienes razón, el caso de anotación es útil. Lo que quise decir fue, ¿hay algún caso útil para la expresión tipada? ¿Por qué querría tener un caso en el que un valor final sea una referencia? – scalapeno