Ich habe es versucht:
class Foo(bar: Int)
vs:
class Foo(private val bar: Int)
und sie scheinen sich gleich zu verhalten, obwohl ich nirgendwo etwas finden konnte, das sich (bar:
Int)
erweitert, (private val bar: Int)
so dass meine Frage lautet: Sind diese identisch / ähnlich?
Nebenbei bemerkt, ich habe versucht, -Xprint:typer
diese Codeteile zu verwenden, und sie erzeugen denselben Code, mit Ausnahme einer zusätzlichen Zeile in der zweiten. Wie lese ich diese zusätzliche Zeile?
..
class Foo extends scala.AnyRef {
<paramaccessor> private[this] val bar: Int = _;
def <init>(bar: Int): this.Foo = {
Foo.super.<init>();
()
}
}
..
..
class Foo extends scala.AnyRef {
<paramaccessor> private[this] val bar: Int = _;
<stable> <accessor> <paramaccessor> private def bar: Int = Foo.this.bar;
def <init>(bar: Int): this.Foo = {
Foo.super.<init>();
()
}
}
..
quelle
val
.var
ist verfügbar und sinnvoll, um Konstruktorparameter in (veränderbare) Klasseneigenschaften sowohl in Nicht-case
als auch incase
Klassen zu rendern .bar: Int
zusammengestellt zuprivate[this] val bar: Int
Im ersten Fall
bar
handelt es sich nur um einen Konstruktorparameter. Da der Hauptkonstruktor der Inhalt der Klasse selbst ist, kann darauf zugegriffen werden, jedoch nur von dieser Instanz aus. Es ist also fast gleichbedeutend mit:Auf der anderen Seite handelt es sich im zweiten Fall
bar
um ein normales privates Feld, auf das diese Instanz und andere Instanzen von zugreifen könnenFoo
. Zum Beispiel kompiliert dies gut:Und läuft:
Das geht aber nicht:
quelle
bar: Int
undprivate val ...
.