J'ai l'habitude de penser qu' private val
et private final val
sont même, jusqu'à ce que j'ai vu à la section 4.1 de la Scala de Référence:
Une valeur constante de la définition est de la forme
final val x = e
où e est une expression constante (§6.24). Le dernier modificateur doit être présent et sans annotation de type peut être donné. Les références à la valeur de la constante x sont eux-mêmes traités comme des expressions constantes; dans le code généré, ils sont remplacés par la définition de la droite de l'e.
Et j'ai écrit un test:
class PrivateVal {
private val privateVal = 0
def testPrivateVal = privateVal
private final val privateFinalVal = 1
def testPrivateFinalVal = privateFinalVal
}
javap -c
sortie:
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
}
Le byte-code est juste que Scala de Référence, a déclaré: private val
n'est private final val
.
Pourquoi ne pas scalac de traitement, private val
comme private final val
? Est-il une raison sous-jacente?