multiple constructors scala scala-2.10

constructors - Parámetros del constructor Scala



multiple constructors scala (2)

Sí, hay dos diferencias importantes. Primero para uno fácil: los parámetros del constructor sin las palabras clave var o val no son variables mutables, sus valores no se pueden cambiar en el cuerpo de la clase.

Sin embargo, incluso si nos limitamos a la palabra clave val , todavía hay una diferencia entre private val parámetros private val y sin palabra clave. Considera lo siguiente:

class Person(private val firstName: String, lastName: String)

Si observamos la clase compilada con javap -v Person , veremos que solo tiene un campo, para el primer nombre. lastName es solo un parámetro de constructor, lo que significa que puede ser recolectado en la basura después de que la clase sea inicializada, etc.

El compilador es lo suficientemente inteligente como para saber cuándo será necesario el valor de lastName después de la inicialización, y en ese caso creará un campo para él. Considere la siguiente variación:

class Person(private val firstName: String, lastName: String) { def fullName = firstName + " " + lastName }

El compilador puede decir que puede necesitar el valor de lastName más adelante, y si revisamos javap nuevo, veremos que la clase tiene dos campos (tenga en cuenta que si hubiéramos definido fullName como val lugar de def , se sólo tiene un campo).

Por último, tenga en cuenta que si hacemos que el primer nombre sea un objeto privado en lugar de una clase privada , funciona exactamente como un simple parámetro de constructor sin palabras clave:

class Person(private[this] val firstName: String, lastName: String)

Esto funciona incluso con var lugar de val :

class Person(private[this] var firstName: String, lastName: String)

Ambas clases no tendrán campos. Consulte la sección 5.2 de la especificación de lenguaje para obtener más detalles sobre el acceso privado a objetos.

¿Cuál es la diferencia entre un parámetro de constructor var privado y un parámetro de constructor sin val / var? ¿Son iguales en términos de alcance / visibilidad?

Ex:

class Person(private var firstName:String, lastName:String)


como complemento, si su clase es una clase de caso, todos los parámetros del constructor serán campos públicos automáticamente.

El compilador se quejará de la palabra clave privada si existe, y para los parámetros sin val / var, sin importar si se usan o no en cualquier definición, habrá campos públicos generados para ellos.