Solía pensar eso private valy private final valson lo mismo, hasta que vi la sección 4.1 en Scala Reference:
Una definición de valor constante tiene la forma
final val x = edonde e es una expresión constante (§6.24). El modificador final debe estar presente y no se puede dar ninguna anotación de tipo. Las referencias al valor constante x se tratan en sí mismas como expresiones constantes; en el código generado se reemplazan por el lado derecho de la definición e.
Y he escrito una prueba:
class PrivateVal {
private val privateVal = 0
def testPrivateVal = privateVal
private final val privateFinalVal = 1
def testPrivateFinalVal = privateFinalVal
}
javap -c salida:
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
}
El código de bytes es tal como lo dijo Scala Reference: private valno lo es private final val.
¿Por qué scalac no trata simplemente private valcomo private final val? ¿Existe alguna razón subyacente?
privatemodificador de alcance tiene la misma semántica que package privateen Java. Puede querer decir private[this].
privatesignifica que solo es visible para instancias de esta clase, private[this]solo esta instancia, excepto para instancias de la misma clase , privateno permite que nadie (incluido del mismo paquete) acceda al valor.
valya es inmutable, ¿por qué necesitamos lafinalpalabra clave en Scala? ¿Por qué el compilador no puede tratar todos los correos electrónicos devalla misma manera quefinal vallos correos electrónicos?