Eu tenho tentado:
class Foo(bar: Int)
vs:
class Foo(private val bar: Int)
e eles parecem se comportar da mesma forma, embora eu não tenha encontrado nenhum lugar que diga que se (bar:
Int)
expanda, (private val bar: Int)
então minha pergunta é: são idênticos / similares?
Em uma nota lateral, eu tenho tentado usar -Xprint:typer
essas partes de código e elas produzem o mesmo código, exceto por uma linha extra no segundo. Como leio essa linha 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>();
()
}
}
..
fonte
val
.var
está disponível e significativo a renda parâmetros do construtor em propriedades (mutável) classe tanto em nãocase
ecase
classes.bar: Int
paraprivate[this] val bar: Int
No primeiro caso,
bar
é apenas um parâmetro construtor. Como o construtor principal é o conteúdo da própria classe, ele é acessível, mas somente a partir desta instância. Portanto, é quase equivalente a:Por outro lado, no segundo caso,
bar
é um campo privado normal , portanto, é acessível a essa instância e a outras instâncias deFoo
. Por exemplo, isso compila bem:E corre:
Mas isso não acontece:
fonte
bar: Int
eprivate val ...
.