Без типа final val
действует как литеральная константа - идентификатор заменяется его значением во время компиляции.С типом он становится ссылкой на что-то, хранящееся где-то, что не может использоваться в аннотациях.
Это определено в разделе 4.1 спецификации:
Определение константыв форме
final val x = e
, где e - постоянное выражение (§6.24).Окончательный модификатор должен присутствовать, и никакая аннотация типа не может быть дана.Ссылки на постоянное значение x сами по себе рассматриваются как константные выражения;в сгенерированном коде они заменяются на правую часть определения е.
Это единственный способ получить истинные именованные константы в Scala.Они имеют преимущества в производительности, они гарантированно не мутируют (даже final val
с типом можно изменить с помощью отражения) и, конечно, их можно использовать в аннотациях.