Добавление явного типа к val предотвращает использование val в качестве константы в аннотации - PullRequest
9 голосов
/ 28 июля 2011

Из отчета:

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()

Может кто-нибудь объяснить, почему это работает только без типа?

1 Ответ

8 голосов
/ 29 июля 2011

Без типа final val действует как литеральная константа - идентификатор заменяется его значением во время компиляции.С типом он становится ссылкой на что-то, хранящееся где-то, что не может использоваться в аннотациях.

Это определено в разделе 4.1 спецификации:

Определение константыв форме

final val x = e

, где e - постоянное выражение (§6.24).Окончательный модификатор должен присутствовать, и никакая аннотация типа не может быть дана.Ссылки на постоянное значение x сами по себе рассматриваются как константные выражения;в сгенерированном коде они заменяются на правую часть определения е.

Это единственный способ получить истинные именованные константы в Scala.Они имеют преимущества в производительности, они гарантированно не мутируют (даже final val с типом можно изменить с помощью отражения) и, конечно, их можно использовать в аннотациях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...