Ja, es gibt zwei wichtige Unterschiede. Zunächst einmal für den einfachen Fall: Konstruktorparameter ohne die Schlüsselwörter var
oder val
sind keine veränderbaren Variablen - ihre Werte können im Rumpf der Klasse nicht geändert werden.
Auch wenn wir uns auf das Schlüsselwort val
beschränken, besteht dennoch ein Unterschied zwischen private val
und Schlüsselwort-freien Parametern. Beachten Sie Folgendes:
class Person(private val firstName: String, lastName: String)
Wenn wir mit javap -v Person
in der kompilierten Klasse aussehen, wir werden sehen, dass es nur ein Feld hat, für firstName
. lastName
ist nur ein Konstruktor Parameter, das heißt, es Garbage Collection sein kann, nachdem die Klasse initialisiert wird, usw.
Der Compiler intelligent genug, um zu wissen, wann der Wert lastName
wird nach der Initialisierung benötigt werden, und es wird ein erstellen Feld dafür in diesem Fall. Betrachten Sie die folgende Variante:
class Person(private val firstName: String, lastName: String) {
def fullName = firstName + " " + lastName
}
Der Compiler kann sagen, dass es später den Wert von lastName
brauchen, und wenn wir javap
wieder überprüfen wir werden sehen, dass die Klasse hat zwei Felder (beachten Sie, dass, wenn wir definiert hatten fullName
als val
anstelle von def
, würde es nur ein Feld haben).
Schließlich beachten Sie, dass, wenn wir firstName
Objekt-private statt privaten Klassen machen, es funktioniert genau wie eine normale alte Keyword-less Konstruktorparameter:
class Person(private[this] val firstName: String, lastName: String)
Dies funktioniert auch mit var
statt val
:
class Person(private[this] var firstName: String, lastName: String)
Beide Klassen haben keine Felder. Weitere Details zum Objekt-privaten Zugriff finden Sie in Abschnitt 5.2 von the language specification.
Überprüfen Sie diese Frage: http://stackoverflow.com/questions/15639078/scala-class-constructor-parameters – danielkza
Dies hat eine bessere Erklärung: http://stackoverflow.com/questions/14694712/do-scala- constructor-parameters-default-to-private-val – lcn