Это явно указано в спецификации , и они автоматически окончательны:
Члены конечных классов или объектов также неявно также окончательны, поэтому
blockquote>final
модификатор, как правило, также избыточен для них. Однако обратите внимание, что для определения постоянных значений (§ 4.1) требуется явный модификаторfinal
, даже если они определены в конечном классе или объекте.Ваш
final
-less пример компилируется без ошибок (или предупреждений) с помощью 2.10-M7, поэтому я предполагаю, что существует проблема с проверкой@switch
в более ранних версиях и что члены фактически являются окончательными.Обновление: на самом деле это более любопытно, чем я ожидал, - если мы скомпилируем следующее: либо 2.9.2, либо 2.10-M7:
object NonFinal { val a = 0 } object Final { final val a = 0 }
javap
показывает разницу:public final class NonFinal$ implements scala.ScalaObject { public static final NonFinal$ MODULE$; public static {}; public int a(); } public final class Final$ implements scala.ScalaObject { public static final Final$ MODULE$; public static {}; public final int a(); }
Вы видите то же самое, даже если правая часть определения значений не является постоянным выражением.
Итак, я оставлю свой ответ, но это не является окончательным.