nadal jestem całkiem nowy, Scala, ale wiem, że można zdefiniować zmienne klasy, które są inicjowane w konstruktorze jakScala zmienne końcowe w konstruktorze
class AClass(aVal: String)
który będzie jak w następujący sposób w Javie
class AClass {
private String aVal;
public AClass(String aVal) {
this.aVal = aVal;
}
}
W języku Java zadeklarowałbym aVal jako ostateczny. Czy istnieje sposób na stworzenie zmiennej zmiennej aVal w składni Scala?
EDIT: Tutaj jest to, co widzę, kiedy mogę skompilować następujące klasy Scala:
class AClass(aVal: String) {
def printVal() {
println(aVal)
}
}
wpadłem javap -private
, ale wyjście
public class AClass extends java.lang.Object implements scala.ScalaObject{
private final java.lang.String aVal;
public void printVal();
public AClass(java.lang.String);
}
Kiedy zmienić definicję klasy scala mieć class AClass(**val** aVal: String)
Otrzymuję następujące dane wyjściowe od 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);
}
Generowana jest publiczna metoda aVal
. Nadal się tutaj uczę - czy ktoś może wyjaśnić, dlaczego tak się dzieje?
Uwaga używam Scala 2,9
Ug. Musiałem zapomnieć o rekompilacji, a następnie potwierdziłem moje odkrycia z zachowaniem starszych implementacji (http://scala-programming-language.1934581.n4.nabble.com/Val-and-Final-td1993410.html). Jesteś rzeczywiście poprawny. Problem, o którym wspomniałem, o tym, że podklasy są w stanie przesłonić valsy (i jest to problem dla finałów) jest obchodzony z uwagi na to, że ukryte pole jest prywatne, a akcesory w wygenerowanych klasach nadpisują te w rodzicu (które nie są ostateczne). Dzięki za ustawienie go prosto. – Chris