style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Atributos de clase debe ser iniciado

Como por estos lares se habla muy bien de Scala, ps he comenzado a aprender el lenguaje, me surge una duda, estoy creando una clase llamada Persona, esta clase tiene una serie de atributos, pero si yo no inicio los atributos, ahora lo hago a null, el me dice que debo realizar una inicializacion previa para poder declararla, sino me sale indefinida.
Ejemplo:

class Persona {
  var identificacion: Int
  var primerNombre: String
  var segundoNombre: String
  var primerApellido: String
  var segundoApellido: String
}

Debí iniciarla de la siguiente manera para que no genere error en el momento de la compilación

class Persona {
  var identificacion: Int  = 0
  var primerNombre: String = null
  var segundoNombre: String = null
  var primerApellido: String = null
  var segundoApellido: String = null
}

Porqué sucede esto?

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

Razones...

Scala puede ser engañoso. Tal vez piensas que lo que escribiste es equivalente a tener una clase Persona en Java con esas propiedades, pero no es completamente cierto... en Scala, cuando declaras una clase, puedes poner código dentro de la declaración, y ese código se ejecuta en el constructor. Aparte de eso, las declaraciones de propiedades que hagas, por default serán públicas (tipo Groovy; por ejemplo, tienes una variable tipo Int llamada identificacion, la cual no será directamente accesible desde fuera, pero tiene un getter y un setter, públicos).

Por eso las variables las debes inicializar, porque es como si las declararas en el constructor; aunque no tengas código que las utilice después, podrías tenerlo:

class Persona {
  var identificacion:Int
  println(identificacion)
}

Eso es código Scala, casi válido, porque no va a compilar, te va a dar el mismo error de la variable no inicializada. Luego le pones un valor inicial a tu variable y listo, ya compila. Cuando creas una nueva persona, te imprime el valor inicial que le hayas puesto, porque ese código que está dentro de la clase, así nomás sin ningún método, se convierte en el código del constructor por default, que en este caso no tiene argumentos.

Si quieres ponerle un constructor con argumentos a tu clase, le declaras los argumentos en la declaración de la clase:

class Persona(identificacion:Int) {
  println("Nueva persona con ID="+identificacion)
}

En este caso, tienes una clase Persona que tiene un constructor por default que recibe un argumento llamado identificacion. Cuando creas una nueva instancia, se imprime el ID que le hayas pasado. Este ID no es accesible desde fuera; ahora sí queda como una variable de instancia privada, inmutable por cierto. Si quieres que sea además de todo accesible desde fuera, puedes ponerle val para que sea público pero inmutable, o var si quieres que sea pública y mutable:

class Persona1(val identificacion:Int) {
  println("Nueva Persona1 con ID=" + identificacion)
}

class Persona2(var identificacion:Int) {
  println("Nueva persona2 ID=" + identificacion)
}

val p1 = new Persona1(1)
val p2 = new Persona2(2)

//Esto se puede
println(p1.identificacion)
println(p2.identificacion)
p2.identificacion=5
println(p2.identificacion)
//Esto no se puede
p1.identificacion=6

En Scala lo recomendable es que a tu clase le pongas un constructor que reciba todos los valores que requiera para poder funcionar, y que todo lo que pueda ser inmutable lo manejes como inmutable.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">