Search code examples
kotlinnullabledefault-parameters

Is there a way to use the default value on a non-optional parameter when null is passed?


For example, if I have the following data class:

data class Data(
    val name: String = "",
    val number: Long = 0
)

And functions that can return null:

fun newName(): String? {}

fun newNumber(): Long? {}

I know I can use the following to use the value of the functions if they are not null:

val newName = newName()
val newNumber = newNumber()

val data = Data(
        if (newName != null) newName else "",
        if (newNumber != null) newNumber else 0
)

But is there a way to just use the default value specified in the constructor of the Data class when the values are null?

I could not find anything in the documentation, but I was hoping something like this would work:

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

But that does not compile.


Solution

  • You can define a companion object for your data class and overload its invoke operator to use default values when null is passed:

    data class Data private constructor(
        val name: String,
        val number: Long
    ) {
        companion object {
            operator fun invoke(
                name: String? = null,
                number: Long? = null
            ) = Data(
                name ?: "",
                number ?: 0
            )
        }
    }