Я думав, що це 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
? Чи є якась основна причина?
private
модифікатор області має ту саму семантику, що і package private
в Java. Ви можете сказати private[this]
.
private
мається на увазі, що він видимий лише для екземплярів цього класу, private[this]
лише цей екземпляр - за винятком екземплярів того ж класу ,private
не дозволяє нікому (включати з одного пакету) доступ до значення.
val
вже є незмінним, навіщо нам взагалі потрібнеfinal
ключове слово у Scala? Чому компілятор не може ставитись до всіхval
s так само, якfinal val
s?