io sono ancora abbastanza nuovo per Scala, ma so che è possibile definire variabili di classe che vengono inizializzate nel costruttore comeScala variabili finali costruttore
class AClass(aVal: String)
che sarebbe come fare quanto segue in java
class AClass {
private String aVal;
public AClass(String aVal) {
this.aVal = aVal;
}
}
In Java, dichiarare aVal come finale. C'è un modo per rendere la variabile aVal finale nella sintassi di Scala?
EDIT: Ecco quello che sto vedendo quando compilo la seguente classe Scala:
class AClass(aVal: String) {
def printVal() {
println(aVal)
}
}
mi sono imbattuto javap -private
ed ho ottenuto l'uscita
public class AClass extends java.lang.Object implements scala.ScalaObject{
private final java.lang.String aVal;
public void printVal();
public AClass(java.lang.String);
}
Quando ho modificare la definizione di classe scala di avere class AClass(**val** aVal: String)
Ottengo il seguente output da 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);
}
Viene generato il metodo pubblico aVal
. Sto ancora imparando qui - qualcuno può spiegare perché viene generato?
Nota Sto usando Scala 2,9
Ug. Devo aver dimenticato di ricompilare e quindi convalidare le mie scoperte con il comportamento delle implementazioni precedenti (http://scala-programming-language.1934581.n4.nabble.com/Val-and-Final-td1993410.html). Sei davvero corretto. Il problema che ho menzionato riguardo alle sottoclassi di essere in grado di sovrascrivere vals (e questo è un problema per le finali) è aggirato in virtù del fatto che il campo sottostante è privato e gli accessor nelle classi generate che sovrascrivono quelli del genitore (che non sono definitivi). Grazie per averlo impostato correttamente. – Chris