Раньше я думал, что это одно private val
и то private final val
же, пока не увидел раздел 4.1 в Справочнике по Scala:
Определение постоянного значения имеет вид
final val x = e
где e - постоянное выражение (§6.24). Должен присутствовать последний модификатор, а аннотация типа не может быть дана. Ссылки на постоянное значение x сами по себе рассматриваются как постоянные выражения; в сгенерированном коде они заменяются правой частью определения e.
И я написал тест:
class PrivateVal {
private val privateVal = 0
def testPrivateVal = privateVal
private final val privateFinalVal = 1
def testPrivateFinalVal = privateFinalVal
}
javap -c
вывод:
Compiled from "PrivateVal.scala"
public class PrivateVal {
public int testPrivateVal();
Code:
0: aload_0
1: invokespecial #19 // Method privateVal:()I
4: ireturn
public int testPrivateFinalVal();
Code:
0: iconst_1
1: ireturn
public PrivateVal();
Code:
0: aload_0
1: invokespecial #24 // Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_0
6: putfield #14 // Field privateVal:I
9: return
}
Байт-код такой же, как и в Scala Reference: private val
нет private final val
.
Почему к скальаку не относятся просто private val
так private final val
? Есть ли основная причина?
val
уже является неизменяемым, зачем нам вообще нужноfinal
ключевое слово в Scala? Почему компилятор не может обрабатывать все такval
же, какfinal val
s?