Я думав, що це 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? Чому компілятор не може ставитись до всіхvals так само, якfinal vals?