kotlin - validación - ¿Hay alguna forma de utilizar el valor predeterminado en un parámetro no opcional cuando se pasa el valor nulo?
reglas de validación en access 2016 (2)
Puede crear un constructor secundario que use los mismos valores predeterminados cuando reciba un null
:
data class Data(
val name: String = "",
val number: Long = 0
) {
constructor(
name: String? = null,
number: Long? = null
) : this(
name ?: "",
number ?: 0
)
}
Por ejemplo, si tengo la siguiente clase de datos:
data class Data(
val name: String = "",
val number: Long = 0
)
Y funciones que pueden devolver null
:
fun newName(): String? {}
fun newNumber(): Long? {}
Sé que puedo usar lo siguiente para usar el valor de las funciones si no son null
:
val newName = newName()
val newNumber = newNumber()
val data = Data(
if (newName != null) newName else "",
if (newNumber != null) newNumber else 0
)
Pero, ¿hay una manera de usar el valor predeterminado especificado en el constructor de la clase de Data
cuando los valores son null
?
No pude encontrar nada en la documentación, pero esperaba que algo como esto funcionara:
val data = Data(newName()?, newNumber()?)
Pero eso no se compila.
el constructor secundario solo admite las propiedades primitivas de Nullable. lo que significa que dará como resultado 2 constructores iguales si la propiedad no es un tipo primitivo, por ejemplo:
data class Data(val name: String) {
constructor(name: String? = null) : this(name ?: "foo");
// ^--- report constructor signature error
}
data class Data(val number: Long = 0) {
constructor(number: Long? = null) : this(number ?: 0)
// ^--- No problem since there are 2 constructors generated:
// Data(long number) and Data(java.lang.Long number)
}
una forma alternativa es usar el operador de invoke
para eso, por ejemplo:
data class Data(val name: String) {
companion object {
operator fun invoke(name: String? = null) = Data(name ?: "")
}
}
Si la clase no es una clase de datos, entonces puede perezoso inicializar las propiedades de los parámetros, en lugar de definir las propiedades en el constructor primario, por ejemplo:
class Data(name: String? = null, number: Long? = null) {
val name = name ?: ""
val number = number ?: 0
}