Kiedyś tak myślałem private vali tak private final valjest, dopóki nie zobaczyłem sekcji 4.1 w Scala Reference:
Definicja wartości stałej ma postać
final val x = egdzie e jest wyrażeniem stałym (§ 6.24). Ostateczny modyfikator musi być obecny i nie można podawać adnotacji typu. Odniesienia do stałej wartości x same są traktowane jako wyrażenia stałe; w generowanym kodzie są zastępowane prawą stroną definicji e.
Napisałem test:
class PrivateVal {
private val privateVal = 0
def testPrivateVal = privateVal
private final val privateFinalVal = 1
def testPrivateFinalVal = privateFinalVal
}
javap -c wynik:
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
}
Kod bajtowy jest taki, jak powiedział Scala Reference: private valnie private final val.
Dlaczego scalac nie traktuje po prostu private valjako private final val? Czy jest jakiś podstawowy powód?
privatemodyfikator zakresu ma taką samą semantykę jak package privatew Javie. Możesz chcieć powiedzieć private[this].
privatechodzi mi o to, że jest to widoczne tylko dla instancji tej klasy, private[this]tylko ta instancja - z wyjątkiem instancji tej samej klasy , privatenie pozwala nikomu (w tym z tego samego pakietu) na dostęp do wartości.
valjest już niezmienne, dlaczego w ogóle potrzebujemyfinalsłowa kluczowego w Scali? Dlaczego kompilator nie może traktować wszystkichvaltak samo jakfinal vals?