传递 null 时,有没有办法在非可选参数上使用默认值?
Is there a way to use the default value on a non-optional parameter when null is passed?
比如我有如下数据class:
data class Data(
val name: String = "",
val number: Long = 0
)
以及可以 return null
:
的函数
fun newName(): String? {}
fun newNumber(): Long? {}
我知道我可以使用以下函数来使用函数的值,如果它们不是 null
:
val newName = newName()
val newNumber = newNumber()
val data = Data(
if (newName != null) newName else "",
if (newNumber != null) newNumber else 0
)
但是当值为 null
时,有没有办法只使用 Data
class 的构造函数中指定的默认值?
我在文档中找不到任何内容,但我希望这样的东西能起作用:
val data = Data(newName()?, newNumber()?)
但是不能编译。
您可以定义一个 companion object for your data class and overload its invoke operator 以在传递 null
时使用默认值:
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
)
}
}
辅助构造函数仅支持 Nullable 原始属性。这意味着如果 属性 不是原始类型,它将产生 2 个相同的构造函数,例如:
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)
}
另一种方法是使用 invoke
运算符,例如:
data class Data(val name: String) {
companion object {
operator fun invoke(name: String? = null) = Data(name ?: "")
}
}
如果 class 不是数据 class,那么你可以从参数中延迟初始化属性,而不是在主构造函数上定义属性,例如:
class Data(name: String? = null, number: Long? = null) {
val name = name ?: ""
val number = number ?: 0
}
如果需要,我可以提供另一种解决方案:
data class Data(
val inputName: String?,
val inputNumber: Long?
) {
private val name = inputName ?: ""
private val number = inputNumber ?: 0
}
比如我有如下数据class:
data class Data(
val name: String = "",
val number: Long = 0
)
以及可以 return null
:
fun newName(): String? {}
fun newNumber(): Long? {}
我知道我可以使用以下函数来使用函数的值,如果它们不是 null
:
val newName = newName()
val newNumber = newNumber()
val data = Data(
if (newName != null) newName else "",
if (newNumber != null) newNumber else 0
)
但是当值为 null
时,有没有办法只使用 Data
class 的构造函数中指定的默认值?
我在文档中找不到任何内容,但我希望这样的东西能起作用:
val data = Data(newName()?, newNumber()?)
但是不能编译。
您可以定义一个 companion object for your data class and overload its invoke operator 以在传递 null
时使用默认值:
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
)
}
}
辅助构造函数仅支持 Nullable 原始属性。这意味着如果 属性 不是原始类型,它将产生 2 个相同的构造函数,例如:
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)
}
另一种方法是使用 invoke
运算符,例如:
data class Data(val name: String) {
companion object {
operator fun invoke(name: String? = null) = Data(name ?: "")
}
}
如果 class 不是数据 class,那么你可以从参数中延迟初始化属性,而不是在主构造函数上定义属性,例如:
class Data(name: String? = null, number: Long? = null) {
val name = name ?: ""
val number = number ?: 0
}
如果需要,我可以提供另一种解决方案:
data class Data(
val inputName: String?,
val inputNumber: Long?
) {
private val name = inputName ?: ""
private val number = inputNumber ?: 0
}