Ne scala constructeur par défaut des paramètres de privé val?
J'ai essayé:
class Foo(bar: Int)
vs:
class Foo(private val bar: Int)
et ils semblent se comporter de la même, bien que je ne pouvais pas trouver n'importe où en disant que (bar:
étend à
Int)(private val bar: Int)
donc ma question est, sont-ils
identiques ou semblables?
Sur une note de côté, j'ai essayé d'utiliser -Xprint:typer
sur ces morceaux de code et ils
produire le même code, sauf pour une ligne supplémentaire dans le second. Comment puis-je
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>();
()
}
}
..
Vous devez vous connecter pour publier un commentaire.
bar: Int
C'est à peine un paramètre du constructeur. Si cette variable n'est pas utilisé n'importe où sauf le constructeur, il y reste. Aucun champ n'est généré. Sinon
private val bar
champ est créé et la valeur debar
paramètre est affecté. Pas de getter est créé.private val bar: Int
La déclaration de paramètre permettra de créer
private val bar
domaine privé de lecture. Ce comportement est le même que ci-dessus, peu importe si le paramètre a été utilisé à côté du constructeur (par exemple, danstoString()
ou pas).val bar: Int
Même que ci-dessus mais Scala-comme getter est public
bar: Int
dans le cas des classesLorsque les classes sont impliquées, par défaut de chaque paramètre a
val
modificateur.val
.case
etcase
classes.val
parce que c'est ce que l'OP a demandé etval
est plus idiomatique.bar: Int
compilé pourprivate[this] val bar: Int
private val bar: Int
sinon, il suffit de rouler avecbar: Int
.Dans le premier cas,
bar
n'est qu'un paramètre du constructeur. Depuis le principal constructeur est le contenu de la classe elle-même, elle est accessible, mais seulement à partir de cette instance. Donc, il est presque équivalent à:D'autre part, dans le second cas
bar
est un normal domaine privé, de sorte qu'il est accessible à cette instance et d'autres instances deFoo
.Par exemple, cette compile amende:
Et s'exécute:
Mais ce n'est pas le cas:
bar: Int
etprivate val ...
.