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

前端 未结 2 1592
孤城傲影
孤城傲影 2021-02-04 23:44

For example, if I have the following data class:

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

And functions that ca

相关标签:
2条回答
  • 2021-02-05 00:24

    the secondary constructor only supports for the Nullable primitive properties. which means it will result in 2 same constructors if the property is not a primitive type, for example:

    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)
    }
    

    an alternative way is using invoke operator for that, for example:

    data class Data(val name: String) {
        companion object {
            operator fun invoke(name: String? = null) = Data(name ?: "")
        }
    }
    

    IF the class is not a data class, then you can lazy initializing properties from parameters, rather than define properties on the primary constructor, for example:

    class Data(name: String? = null, number: Long? = null) {
        val name = name ?: ""
        val number = number ?: 0
    }
    
    0 讨论(0)
  • 2021-02-05 00:28

    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
            )
        }
    }
    
    0 讨论(0)
提交回复
热议问题