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:typeren 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.varestá disponible y es significativo para representar los parámetros del constructor en propiedades de clase (mutables) tanto en clasescasecomo nocase.bar: Intcompila aprivate[this] val bar: IntEn el primer caso,
bares 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
bares 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: Intyprivate val ....