¿Hay alguna forma de utilizar el valor pnetworkingeterminado en un parámetro no opcional cuando se pasa null?

Por ejemplo, si tengo la siguiente class 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 alguna manera de usar el valor pnetworkingeterminado especificado en el constructor de la class Data cuando los valores son null ?

No pude encontrar nada en la documentation, pero esperaba que algo como esto funcionaría:

 val data = Data(newName()?, newNumber()?) 

Pero eso no comstack.

Puede crear un constructor secundario que use los mismos valores pnetworkingeterminados cuando reciba null :

 data class Data( val name: String = "", val number: Long = 0 ) { constructor( name: String? = null, number: Long? = null ) : this( name ?: "", number ?: 0 ) } 

el constructor secundario solo admite las properties primitivas Nullable. lo que significa que resultará en 2 mismos constructores 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 class no es una class de datos, entonces puede usar properties de initialization diferidas de los parameters, en lugar de definir properties en el constructor primario, por ejemplo:

 class Data(name: String? = null, number: Long? = null) { val name = name ?: "" val number = number ?: 0 }