Próbowałem:
class Foo(bar: Int)
vs:
class Foo(private val bar: Int)
i wydaje się, że zachowują się tak samo, chociaż nie mogłem znaleźć nigdzie stwierdzenia, które (bar:
Int)
rozszerza się do, (private val bar: Int)
więc moje pytanie brzmi: czy są one identyczne / podobne?
Na marginesie, próbowałem użyć -Xprint:typer
tych fragmentów kodu i generują ten sam kod, z wyjątkiem dodatkowej linii w drugim. Jak mam przeczytać tę dodatkową linijkę?
..
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>();
()
}
}
..
val
.var
jest dostępny i sensowny do renderowania parametrów konstruktora na (zmienne) właściwości klas zarówno w klasach nie-, jakcase
icase
klasach.bar: Int
doprivate[this] val bar: Int
W pierwszym przypadku
bar
jest tylko parametrem konstruktora. Ponieważ głównym konstruktorem jest zawartość samej klasy, jest ona dostępna w niej, ale tylko z tej samej instancji. Więc jest to prawie równoważne z:class Foo(private[this] val bar:Int)
Z drugiej strony w drugim przypadku
bar
jest to normalne pole prywatne, więc jest dostępne dla tej instancji i innych instancjiFoo
. Na przykład kompiluje się dobrze:class Foo(private val bar: Int) { def otherBar(f: Foo) { println(f.bar) // access bar of another foo } }
I biegnie:
scala> val a = new Foo(1) a: Foo = Foo@7a99d0af scala> a.otherBar(new Foo(3)) 3
Ale to nie jest:
class Foo(bar: Int) { def otherBar(f: Foo) { println(f.bar) // error! cannot access bar of another foo } }
źródło
bar: Int
iprivate val ...
.