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

前端 未结 2 1593
孤城傲影
孤城傲影 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
    }
    

提交回复
热议问题