J'ai essayé:
class Foo(bar: Int)
contre:
class Foo(private val bar: Int)
et ils semblent se comporter de la même manière bien que je ne puisse trouver nulle part disant que cela se (bar:
Int)
développe (private val bar: Int)
donc ma question est, sont-ils identiques / similaires?
Sur une note latérale, j'ai essayé d'utiliser -Xprint:typer
sur ces morceaux de code et ils produisent le même code à l'exception d'une ligne supplémentaire dans le second. Comment lire cette ligne supplémentaire?
..
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
est disponible et utile pour rendre les paramètres du constructeur en propriétés de classe (mutables) à la fois dans les classes noncase
etcase
.bar: Int
compilé àprivate[this] val bar: Int
Dans le premier cas,
bar
n'est qu'un paramètre de constructeur. Puisque le constructeur principal est le contenu de la classe elle-même, il y est accessible, mais uniquement à partir de cette instance. Donc c'est presque équivalent à:D'autre part, dans le second cas, il
bar
s'agit d'un champ privé normal , il est donc accessible à cette instance et à d' autres instances deFoo
. Par exemple, cela compile bien:Et s'exécute:
Mais cela ne:
la source
bar: Int
etprivate val ...
.