uninitializedpropertyaccessexception studio strings property lateinit enum constructor kotlin

constructor - studio - kotlin enum strings



¿Puede la clase de datos de Kotlin tener más de un constructor? (6)

La clase de datos garantizará la coherencia y el comportamiento significativo, también necesitamos tener valor para la inmutabilidad.

data class SampleData(val name: String, val age: Int, val email: String ?= null) { constructor(name: String, age: Int) : this(name, age, null) { }

}

el constructor secundario debe delegar al constructor primario en su definición, de modo que para mantener la inmutabilidad, tener "nulo" funcionará.

Sé que las clases de datos son como modelos simples en kotlin con getters y setter por defecto y son tan simples como esto:

data class User(val name: String, val age: Int)

¿Es posible declarar un segundo constructor para esa clase de datos?


Los valores predeterminados en el constructor primario eliminan muchas necesidades de los constructores secundarios, pero si la instancia necesaria depende de la lógica basada en datos que deben analizarse, la mejor respuesta puede ser utilizar un objeto complementario.

data class KeyTag(val a: String, val b: Int, val c: Double) { companion object Factory { val empty = KeyTag("", 0, 0.0) fun create(bigString: String): KeyTag { // Logic to extract appropriate values for arguments a, b, c return KeyTag(a, b, c) } fun bake(i: Int): KeyTag = KeyTag("$i", i, i.toDouble()) } }

El uso es entonces:

val ks = KeyTag.create("abc:1:10.0") val ke = KeyTag.empty val kb = KeyTag.bake(2)


Respuesta actualizada para las clases de datos:

Sí, puedes, pero deberás delegar todo en el constructor principal

data class User(val name: String, val age: Int) { constructor(name: String): this(name, -1) { } constructor(age: Int): this("Anon", age) { } } // Anon name: Anon println("Anon name: " + User(30).name) // No age: -1 println("No age: " + User("Name").age) // Name: Name age: 20 val u = User("Name", 20) println("Name: " + u.name + " age: " + u.age)

También puede establecer valores predeterminados en su constructor principal como lo hizo Alexey.


Sí, pero cada variable debe inicializarse, por lo que puede establecer argumentos predeterminados en el constructor de su clase de datos, como este:

data class Person(val age: Int, val name: String = "Person without name")

Ahora puedes crear una instancia de esta clase de datos de dos maneras.

  • Person(30)
  • Person(20, "Bob")

Sí, podemos usar como el código siguiente, y en el constructor primario para la clase de datos debería tener un parámetro mínimo.

data class SampleData(val name: String, val age: Int) { constructor(name: String, age: Int, email: String) : this(name, age) { } }


Una clase de datos Kotlin debe tener un constructor primario que defina al menos un miembro. Aparte de eso, puede agregar constructores secundarios como se explica en Clases y Herencia - Constructores secundarios .

Para su clase, y ejemplo de constructor secundario:

data class User(val name: String, val age: Int) { constructor(name: String): this(name, -1) { ... } }

Observe que el constructor secundario debe delegar al constructor primario en su definición.

Aunque muchas cosas comunes a los constructores secundarios se pueden resolver al tener valores predeterminados para los parámetros. En el caso anterior, podría simplificar a:

data class User(val name: String, val age: Int = -1)

Si llama a estos desde Java, debería leer la interoperabilidad de Java: Java, que llama a la documentación de Kotlin sobre cómo generar sobrecargas y, a veces, el complemento del compilador NoArg para otros casos especiales.