Scala Konstruktor Parameter
Was ist der Unterschied zwischen einem privaten Konstruktor var-parameter und einen Konstruktor ohne parameter val/var? Sind Sie gleichen in Bezug auf scope/Sichtbarkeit?
Ex:
class Person(private var firstName:String, lastName:String)
- Überprüfen Sie heraus diese Frage: stackoverflow.com/questions/15639078/...
- Dies hat eine bessere Erklärung: stackoverflow.com/questions/14694712/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, es gibt zwei wichtige Unterschiede. Zuerst für die einfachen: die Konstruktor-Parameter, ohne die
var
oderval
keywords sind nicht veränderliche Variablen, deren Werte nicht geändert werden können im Körper der Klasse.Selbst wenn wir uns darauf beschränken, auf die
val
keyword, aber es gibt noch einen Unterschied zwischenprivate val
- und keyword-weniger Parameter. Betrachten Sie das folgende:Wenn wir uns die kompilierte Klasse mit
javap -v Person
wird, werden wir sehen, dass es nur einen Bereich, fürfirstName
.lastName
ist nur ein Konstruktor parameter, was bedeutet, es kann Müll, die gesammelt werden, nachdem die Klasse initialisiert wird, etc.Der compiler ist schlau genug zu wissen, wenn der Wert der
lastName
gebraucht werden wird, nach der Initialisierung, und es wird ein Feld für die es in diesem Fall. Betrachten Sie die folgende Variante:Dem compiler sagen kann, dass es eventuell den Wert von
lastName
später, und wenn wir überprüfenjavap
wieder sehen wir, dass die Klasse zwei Felder (beachten Sie, dass wenn wir würden definiertfullName
alsval
statt einerdef
sein, es wäre nur ein Feld).Schließlich, beachten Sie, dass wenn wir
firstName
Objekt-private statt - Klasse-private -, es funktioniert genau wie ein plain old-Schlüsselwort-weniger Konstruktor-parameter:Dies funktioniert auch mit
var
stattval
:Diese beiden Klassen haben keine Felder. Siehe Abschnitt 5.2 der die Sprachspezifikation für mehr details über das Objekt-privater Zugriff.
def fullName
es gibt keinen Unterschied zwischen einemprivate val
und ein Stichwort-weniger parameter?als Ergänzung, wenn Ihre Klasse ein Fall Klasse, alle Konstruktor-Parameter werden automatisch den öffentlichen Bereichen.
Der compiler wird sich beschweren, über das private-Schlüsselwort, wenn es vorhanden ist, und für die Parameter ohne val/var, unabhängig davon, ob Sie benutzt werden oder nicht in irgendwelche defs, wird es öffentliche Felder generiert für Sie.