sigo siendo bastante nuevo en Scala, pero sé que se pueden definir variables de clase que se inicializan en el constructor comoScala variables finales en el constructor
class AClass(aVal: String)
lo que sería como hacer lo siguiente en java
class AClass {
private String aVal;
public AClass(String aVal) {
this.aVal = aVal;
}
}
En Java, declararía aVal como definitivo. ¿Hay alguna manera de hacer que la variable aVal sea definitiva en la sintaxis de Scala?
EDIT: Aquí es lo que estoy viendo cuando compilo la siguiente clase Scala:
class AClass(aVal: String) {
def printVal() {
println(aVal)
}
}
me encontré javap -private
y tengo la salida
public class AClass extends java.lang.Object implements scala.ScalaObject{
private final java.lang.String aVal;
public void printVal();
public AClass(java.lang.String);
}
Cuando cambie la definición de clase Scala tener class AClass(**val** aVal: String)
Obtengo la siguiente salida de javap -private
public class AClass extends java.lang.Object implements scala.ScalaObject{
private final java.lang.String aVal;
public java.lang.String aVal();
public void printVal();
public AClass(java.lang.String);
}
Se genera el método público aVal
. Todavía estoy aprendiendo aquí. ¿Alguien puede explicar por qué se genera eso?
Nota estoy usando Scala 2,9
Ug. Debo haber olvidado volver a compilar y luego corrobore mis hallazgos con el comportamiento de las implementaciones anteriores (http://scala-programming-language.1934581.n4.nabble.com/Val-and-Final-td1993410.html). Usted es de hecho correcto. El problema que mencioné acerca de que las subclases pueden anular vals (y que esto es un problema para finales) se elude en virtud de que el campo subyacente es privado y los accessors en las clases generadas anulan las del padre (que no son definitivas). Gracias por establecerlo. – Chris