Qual è la differenza tra un parametro del costruttore var privato e un parametro costruttore senza val/var? Sono uguali in termini di visibilità/visibilità?Parametri costruttore Scala
Es:
class Person(private var firstName:String, lastName:String)
Qual è la differenza tra un parametro del costruttore var privato e un parametro costruttore senza val/var? Sono uguali in termini di visibilità/visibilità?Parametri costruttore Scala
Es:
class Person(private var firstName:String, lastName:String)
Sì, ci sono due differenze importanti. Innanzitutto per la semplicità: i parametri costruttore senza le parole chiave o val
non sono variabili modificabili, i cui valori non possono essere modificati nel corpo della classe.
Anche se ci limitiamo alla parola chiave val
, c'è ancora una differenza tra private val
e parametri senza parole chiave. Si consideri il seguente:
class Person(private val firstName: String, lastName: String)
Se guardiamo la classe compilata con javap -v Person
, vedremo che essa ha un solo campo, per firstName
. lastName
è solo un parametro del costruttore, il che significa che può essere garbage collection dopo che la classe viene inizializzato, ecc
Il compilatore è abbastanza intelligente per sapere quando sarà necessario il valore di lastName
dopo l'inizializzazione, e si creerà una campo per esso in quel caso. Si consideri il seguente variazione:
class Person(private val firstName: String, lastName: String) {
def fullName = firstName + " " + lastName
}
Il compilatore può dire che potrebbe essere necessario il valore di lastName
più tardi, e se controlliamo javap
di nuovo vedremo che la classe ha due campi (notare che se avessimo definito fullName
come val
invece di uno def
, avrebbe solo un campo).
Infine, si segnala che se facciamo firstName
oggetto-privato invece di classe-privato, funziona esattamente come un normale parola chiave-meno vecchio parametro del costruttore:
class Person(private[this] val firstName: String, lastName: String)
Questo funziona anche con var
invece di val
:
class Person(private[this] var firstName: String, lastName: String)
Entrambe queste classi non avranno campi. Vedere la sezione 5.2 di the language specification per ulteriori dettagli sull'accesso privato dell'oggetto.
Stai dicendo che in situazioni come l'esempio con 'def fullName' non c'è differenza tra un **' private val' ** e un parametro keyword-less? – RussAbbott
come supplemento, se la classe è una classe di caso, tutti i parametri del costruttore saranno automaticamente campi pubblici.
Il compilatore si lamenterà della parola chiave privata se esiste, e per i parametri senza val/var, indipendentemente dal fatto che siano utilizzati o meno in qualsiasi difetto, ci saranno campi pubblici generati per loro.
Dai un'occhiata a questa domanda: http://stackoverflow.com/questions/15639078/scala-class-constructor-parameters – danielkza
Questo ha una spiegazione migliore: http://stackoverflow.com/questions/14694712/do-scala- constructor-parameters-default-to-private-val – lcn