He estado intentando:
class Foo(bar: Int)
vs:
class Foo(private val bar: Int)
y parecen comportarse de la misma manera, aunque no pude encontrar ningún lugar que diga que se (bar:
Int)
expande, (private val bar: Int)
así que mi pregunta es: ¿son idénticos / similares?
En una nota al margen, he estado tratando de usar -Xprint:typer
en estas piezas de código y producen el mismo código, excepto por una línea adicional en la segunda. ¿Cómo leo esa línea extra?
..
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>();
()
}
}
..
fuente
val
.var
está disponible y es significativo para representar los parámetros del constructor en propiedades de clase (mutables) tanto en clasescase
como nocase
.bar: Int
compila aprivate[this] val bar: Int
En el primer caso,
bar
es solo un parámetro constructor. Como el constructor principal es el contenido de la clase en sí, es accesible en él, pero solo desde este mismo caso. Entonces es casi equivalente a:Por otro lado, en el segundo caso
bar
es un campo privado normal , por lo que es accesible para esta instancia y otras instancias deFoo
. Por ejemplo, esto compila bien:Y corre:
Pero esto no:
fuente
bar: Int
yprivate val ...
.